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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.69236 の関連記事表示

<< 0 >>
■69236  Type.GetProperties時の構造体判別
□投稿者/ DD. -(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なのですが、
    上記内容も気になるので、判別法があればご教授をお願い致します。
親記事 /過去ログ118より / 関連記事表示
削除チェック/

■69239  Re[1]: Type.GetProperties時の構造体判別
□投稿者/ 魔界の仮面弁士 -(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 を返します。
記事No.69236 のレス /過去ログ118より / 関連記事表示
削除チェック/

■69240  Re[2]: Type.GetProperties時の構造体判別
□投稿者/ DD. -(2013/12/10(Tue) 18:52:38)
    ご回答ありがとうございます。

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

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

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

    ありがとうございました。
記事No.69236 のレス /過去ログ118より / 関連記事表示
削除チェック/

■69247  Re[3]: Type.GetProperties時の構造体判別
□投稿者/ DD. -(2013/12/11(Wed) 09:07:11)
    お世話になります。DD.です。

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

    解決済とさせてもらいます。
記事No.69236 のレス / END /過去ログ118より / 関連記事表示
削除チェック/

■69248  Re[2]: Type.GetProperties時の構造体判別
□投稿者/ 魔界の仮面弁士 -(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 のプリミティブ型
     ・概念モデルのプリミティブ型
     ・ストレージ プロバイダー固有のプリミティブ型
    といった表現が使われていました。
記事No.69236 のレス / END /過去ログ118より / 関連記事表示
削除チェック/

■69237  Re[1]: Type.GetProperties時の構造体判別
□投稿者/ Hongliang -(2013/12/10(Tue) 17:59:55)
    > 値をPropertyInfo.GetValueで取得する際、
    > 例えばLocationプロパティはPoint構造体かと思いますが、
    > ToString時と同じような出力のされ方となります。({X=225,Y=225})
    > ※この動作に関しても参考にできる文書等あれば教えて頂きたいです

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

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

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

    >
    > 別のアプローチでの解決法をご提示頂けても全然OKなのですが、
    > 上記内容も気になるので、判別法があればご教授をお願い致します。
記事No.69236 のレス /過去ログ118より / 関連記事表示
削除チェック/

■69238  Re[2]: Type.GetProperties時の構造体判別
□投稿者/ Hongliang -(2013/12/10(Tue) 18:03:11)
    すいません、編集中に誤って送信してしまいました。

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

    はっきりとPoint型ならこう、と型を明示して処理を分けるようにした方がいいかと。
記事No.69236 のレス /過去ログ118より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -