2009-07-11 11 views
5

オブジェクトがC#のbuiltin data typeであるかどうかを確認したいと思っています。オブジェクトが組み込みデータ型であるかどうかをチェックする関数はありますか?

可能であれば、これらのすべてをチェックしたくありません。 、私はこれを行うにはしたくないん

 Object foo = 3; 
     Type type_of_foo = foo.GetType(); 
     if (type_of_foo == typeof(string)) 
     { 
      ... 
     } 
     else if (type_of_foo == typeof(int)) 
     { 
      ... 
     } 
     ... 

更新

私は再帰的にPropertyDescriptorをタイプが値を組み込みされない場合がありますPropertyDescriptorCollectionを作成しようとしています。だから私はこのような何かやってみたかった(注:これはまだ動作しませんが、私はそれに取り組んでいます):

public override PropertyDescriptorCollection GetProperties(Attribute[] attributes) 
    { 
     PropertyDescriptorCollection cols = base.GetProperties(attributes); 

     List<PropertyDescriptor> list_of_properties_desc = CreatePDList(cols); 
     return new PropertyDescriptorCollection(list_of_properties_desc.ToArray()); 
    } 

    private List<PropertyDescriptor> CreatePDList(PropertyDescriptorCollection dpCollection) 
    { 
     List<PropertyDescriptor> list_of_properties_desc = new List<PropertyDescriptor>(); 
     foreach (PropertyDescriptor pd in dpCollection) 
     { 
      if (IsBulitin(pd.PropertyType)) 
      { 
       list_of_properties_desc.Add(pd); 
      } 
      else 
      { 
       list_of_properties_desc.AddRange(CreatePDList(pd.GetChildProperties())); 
      } 
     } 
     return list_of_properties_desc; 
    } 

    // This was the orginal posted answer to my above question 
    private bool IsBulitin(Type inType) 
    { 
     return inType.IsPrimitive || inType == typeof(string) || inType == typeof(object); 
    } 

答えて

5

まあ、1つの簡単な方法は、明示的にセットに明示的にリストすることです。私はそれが.NET primitive typeをだならば、それは違いを作るかもしれない方法を理解することができますが、あなたはそれがためのものの一つだ場合、アプリケーションが異なる動作をしたいと思う理由を説明できた -

static readonly HashSet<Type> BuiltInTypes = new HashSet<Type> 
    (typeof(object), typeof(string), typeof(int) ... }; 

... 


if (BuiltInTypes.Contains(typeOfFoo)) 
{ 
    ... 
} 

は、私はそれが重要である理由聞いていますC#自体?これは開発ツール用ですか?

C#4のdynamicの状況を考慮したいと思うかもしれませんが、これは実行時の型ではありませんが、メソッドパラメータなどに適用すると属性はSystem.Objectです。 。

+0

私は再帰的にPropertyDescriptorCollectionを作成したいのですが、型が組み込みかどうかを確認する必要がありました。プロパティの1つが組み込み型でない場合は、新しいコレクションを作成したいと考えました。病気を助けてくれる質問に何をしようとしていますか? – SwDevMan81

+0

しかし、その決定はC#の仕様に基づいているのはなぜですか?なぜDecimalを一方向で扱いたいのですが、DateTimeやGuidを別の方法で扱いたいのですか? –

+0

そうではありません、それは私の見解です。 System.ValueTypeもチェックする必要があります。 – SwDevMan81

9

を直接ではなく、あなたは以下の単純化のチェックを行うことができます

public bool IsBulitin(object o) { 
    var type = o.GetType(); 
    return (type.IsPrimitive && type != typeof(IntPtr) && type != typeof(UIntPtr)) 
     || type == typeof(string) 
     || type == typeof(object) 
     || type == typeof(Decimal); 
} 

IsPrimitiveチェックは、文字列、オブジェクト、および小数を除くすべてをキャッチします。

EDIT

このメソッドは動作しますが、私はジョンのソリューションを好むだろう。理由は簡単です。私が解決策にしなければならなかった編集の数をチェックしています。なぜなら、私が忘れていた型がプリミティブであるかどうか分からなかったからです。それらをすべて明示的にセットにまとめるほうが簡単です。

+0

@ジョンは自分のコメントの前に、更新に潜入、あなたはまた、*のIntPtrを、されていない*それを確認したいと思います) – JaredPar

+1

ました原始的ですが組み込みではありません。だからこそ私はこのメソッドに大変熱心ではありません.2つのリストを比較して違いを解決する必要がありますが、明示的なセットはC#仕様からそのままリストをコピーすることを意味します:) –

+0

@Jared:コメント:(それを捕まえることが起こらなかった人のために、Jaredの答えは最初に小数を含んでいませんでした。私は彼がそれを修正している間にコメントしました...) –

1

私は、これが最良のpossibiliesの一つだと思い:

private static bool IsBulitinType(Type type) 
{ 
    return (type == typeof(object) || Type.GetTypeCode(type) != TypeCode.Object); 
} 
関連する問題