5

オブジェクトがC#の組み込みデータ型であるかどうかを確認したい

可能であれば、それらすべてに対してチェックしたくありません。
つまり、私はこれをしたくありません:

        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);
    }
4

3 に答える 3

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 チェックは、文字列、オブジェクト、10 進数以外のすべてをキャッチします。

編集

この方法は機能しますが、Jon のソリューションをお勧めします。理由は簡単です。忘れていた型がプリミティブであったか、プリミティブでなかったため、ソリューションに加えなければならなかった編集の数を確認してください。それらをすべて明示的にセットにリストする方が簡単です。

于 2009-07-11T22:25:25.387 に答える
5

簡単な方法の 1 つは、それらをセットに明示的にリストすることです。

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

...


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

ただし、なぜそれが重要なのかを尋ねなければなりません - それが.NET プリミティブ型である場合にどのように違いが生じるかは理解できますが、それが C# のものの 1 つである場合、アプリケーションの動作を異なるものにしたい理由を説明できますか? これは開発ツール用ですか?

その質問への答えに応じて、dynamicC# 4 の状況を検討することをお勧めします。これは、実行時の型ではなく、System.Object+ メソッド パラメーターなどに適用されたときの属性です。

于 2009-07-11T22:26:15.603 に答える
1

これは最良の可能性の1つだと思います:

private static bool IsBulitinType(Type type)
{
    return (type == typeof(object) || Type.GetTypeCode(type) != TypeCode.Object);
}
于 2013-06-10T08:43:52.757 に答える