C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Type.GetProperties時の構造体判別


(過去ログ 118 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■69236 / inTopicNo.1)  Type.GetProperties時の構造体判別
  
□投稿者/ DD. (3回)-(2013/12/10(Tue) 17:41:32)

分類:[.NET 全般] 

お世話になります。DD.です。
環境:VS2008+.Net3.5 Win7

フォーム上のコントロールの特定のプロパティをリフレクションで取得し、XMLに落としたいと思い、
各コントロールに対しGetPropertiesしています。

値をPropertyInfo.GetValueで取得する際、
例えばLocationプロパティはPoint構造体かと思いますが、
ToString時と同じような出力のされ方となります。({X=225,Y=225})
※この動作に関しても参考にできる文書等あれば教えて頂きたいです

構造体であることを検知できれば、それに合わせて処理をゴニョゴニョするのですが・・・
IsClassはもちろんfalse、IsValueTypeでは他の値型との判別がつかず、、、
構造体であるか判別する術はあるのでしょうか?

別のアプローチでの解決法をご提示頂けても全然OKなのですが、
上記内容も気になるので、判別法があればご教授をお願い致します。
引用返信 編集キー/
■69237 / inTopicNo.2)  Re[1]: Type.GetProperties時の構造体判別
□投稿者/ Hongliang (137回)-(2013/12/10(Tue) 17:59:55)
> 値をPropertyInfo.GetValueで取得する際、
> 例えばLocationプロパティはPoint構造体かと思いますが、
> ToString時と同じような出力のされ方となります。({X=225,Y=225})
> ※この動作に関しても参考にできる文書等あれば教えて頂きたいです

どこにどうやって出力なさっているか知りませんが、多分実際にToString()が呼び出されているんでしょう。

> 構造体であることを検知できれば、それに合わせて処理をゴニョゴニョするのですが・・・
> IsClassはもちろんfalse、IsValueTypeでは他の値型との判別がつかず、、、
> 構造体であるか判別する術はあるのでしょうか?

IsValueTypeかつIsPrimitiveではなくIsEnumでもない、といった辺りで判別はできるでしょうけども

>
> 別のアプローチでの解決法をご提示頂けても全然OKなのですが、
> 上記内容も気になるので、判別法があればご教授をお願い致します。
引用返信 編集キー/
■69238 / inTopicNo.3)  Re[2]: Type.GetProperties時の構造体判別
□投稿者/ Hongliang (138回)-(2013/12/10(Tue) 18:03:11)
すいません、編集中に誤って送信してしまいました。

> IsValueTypeかつIsPrimitiveではなくIsEnumでもない、といった辺りで判別はできるでしょうけども
判別しても多分何にもならないと思います。
クラスだってToStringをオーバーライドできるのですし。

はっきりとPoint型ならこう、と型を明示して処理を分けるようにした方がいいかと。
引用返信 編集キー/
■69239 / inTopicNo.4)  Re[1]: Type.GetProperties時の構造体判別
□投稿者/ 魔界の仮面弁士 (461回)-(2013/12/10(Tue) 18:19:37)
No69236 (DD. さん) に返信
> 環境:VS2008+.Net3.5 Win7
言語は何でも良いのですね?
とりあえず C# で回答します。


> 例えばLocationプロパティはPoint構造体かと思いますが、
> ToString時と同じような出力のされ方となります。({X=225,Y=225})
どのように出力しているのか分かりませんが、GetValue の戻り値は、
この場合は「Point 構造体を格納した object 型」となる筈ですよ。


> IsClassはもちろんfalse、IsValueTypeでは他の値型との判別がつかず、、、
「他の値型」とは、何を指していますか?

自分の認識では、少なくとも C# で値型といえば
「構造体」と「列挙体」だけという認識です。
http://msdn.microsoft.com/ja-jp/library/s1ax56ch%28vs.90%29.aspx



> 構造体であるか判別する術はあるのでしょうか?
たとえば DialogResult は 列挙型ですが、これは IsEnum で判定可能ですよね。

int は Int32構造体なので OK でしょう。
int? も Nullable<int> 構造体なので OK。
両者を区別したいなら「t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)」。

プリミティブ型かどうかなら、IsPrimitive プロパティです。


# ちなみに、DateTime 型は VB では組み込み型ですが、
# VB で GetType(Date).IsPrimitive と書いても False を返します。
引用返信 編集キー/
■69240 / inTopicNo.5)  Re[2]: Type.GetProperties時の構造体判別
□投稿者/ DD. (4回)-(2013/12/10(Tue) 18:52:38)
ご回答ありがとうございます。

おかしいとは思ってましたが、処理中でToStringしてましたorz
見落としです。すいません。

「他の値型」はプリミティブ型を指していました。
が、IsPrimitiveも見落としてましたorz

頂いた情報で動作を確認した後、解決済チェックしたいと思います。

ありがとうございました。

引用返信 編集キー/
■69247 / inTopicNo.6)  Re[3]: Type.GetProperties時の構造体判別
□投稿者/ DD. (5回)-(2013/12/11(Wed) 09:07:11)
お世話になります。DD.です。

お二方に回答頂いた内容で、構造体の判別ができました。
ありがとうございます。

解決済とさせてもらいます。

解決済み
引用返信 編集キー/
■69248 / inTopicNo.7)  Re[2]: Type.GetProperties時の構造体判別
□投稿者/ 魔界の仮面弁士 (463回)-(2013/12/11(Wed) 10:00:28)
2013/12/11(Wed) 10:28:33 編集(投稿者)

No69239 (魔界の仮面弁士) に追記
> プリミティブ型かどうかなら、IsPrimitive プロパティです。
> # ちなみに、DateTime 型は VB では組み込み型ですが、
> # VB で GetType(Date).IsPrimitive と書いても False を返します。

同様の差異が C# にもありました。IsPrimitive プロパティの場合、
たとえば UIntPtr がプリミティブ型として扱われてしまいますが、
これは C# にとってのプリミティブ型ではありませんよね。


以下は、すべて True と出力されるようです。

Console.WriteLine("Int32:" + typeof(Int32).IsPrimitive);
Console.WriteLine("Int64:" + typeof(Int64).IsPrimitive);
Console.WriteLine("IntPtr:" + typeof(IntPtr).IsPrimitive);
Console.WriteLine("UInt32:" + typeof(UInt32).IsPrimitive);
Console.WriteLine("UInt64:" + typeof(UInt64).IsPrimitive);
Console.WriteLine("UIntPtr:" + typeof(UIntPtr).IsPrimitive);


一方、以下は、すべて False です。
利用頻度が高そうな decimal 構造体が False な点に注意。

Console.WriteLine("Decimal:" + typeof(decimal).IsPrimitive);
Console.WriteLine("String:" + typeof(string).IsPrimitive);
Console.WriteLine("Object:" + typeof(object).IsPrimitive);
Console.WriteLine("Int32[]:" + typeof(int[]).IsPrimitive);
Console.WriteLine("Int32[,]:" + typeof(int[,]).IsPrimitive);
Console.WriteLine("Int32[][]:" + typeof(int[][]).IsPrimitive);
Console.WriteLine("Byte*:" + typeof(byte*).IsPrimitive);
Console.WriteLine("Int32*:" + typeof(int*).IsPrimitive);
Console.WriteLine("Int32**:" + typeof(int**).IsPrimitive);
Console.WriteLine("Void:" + typeof(void).IsPrimitive);
Console.WriteLine("Void*:" + typeof(void*).IsPrimitive);
Console.WriteLine("Void**:" + typeof(void**).IsPrimitive);



No69240 (DD. さん) に返信
> 「他の値型」はプリミティブ型を指していました。
> が、IsPrimitiveも見落としてましたorz

もしも「言語コンパイラにとってのプリミティブ型」の意味で用いるのであれば、
IsPrimitive プロパティは使えないと思います。たとえば、
DateTimeOffset をプリミティブ型として持つ言語系を用いていたとしても、
IsPrimitive は、処理系を問わず False を返してくるように思えます。

もし、VB にとってのプリミティブ型、C# にとってのプリミティブ型といった
意味で判定したいなら、型の一覧を保有しておき、それと比較したほうが良さそうです。


ということで、今回目的としている「プリミティブ型」が、どの範囲の定義を
指しているのか、あらためて考えておいた方が良いかもしれません。ちなみに
Entity Framework の PrimitiveType クラスでは、
 ・.NET Framework のプリミティブ型
 ・概念モデルのプリミティブ型
 ・ストレージ プロバイダー固有のプリミティブ型
といった表現が使われていました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -