是否有一个函数来检查对象是否是内置数据类型?

时间:2009-07-11 22:21:43

标签: c# types built-in built-in-types

我想看看对象是否是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))
        {
            ...
        }
        ...

更新

我正在尝试递归创建一个PropertyDescriptorCollection,其中PropertyDescriptor类型可能不是内置值。所以我想做这样的事情(注意:这还不行,但我正在努力):

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

3 个答案:

答案 0 :(得分: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检查将捕获除字符串,对象和小数之外的所有内容。

编辑

虽然这种方法有效,但我更倾向于Jon的解决方案。原因很简单,检查我必须对我的解决方案进行编辑的次数,因为我忘记的类型或不是原语。更容易只在一组中明确地列出它们。

答案 1 :(得分:5)

嗯,一个简单的方法就是在一个集合中明确地列出它们,例如

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

...


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

我不得不问为什么它很重要 - 我可以理解如果它是.NET primitive type会有什么影响,但你能否解释为什么你希望你的应用程序表现不同如果它是其中一个C#本身?这是一个开发工具吗?

根据该问题的答案,您可能需要考虑C#4中dynamic的情况 - 这不是执行时的类型,而是System.Object +属性当应用于方法参数等时。

答案 2 :(得分:1)

我认为这是最好的可能之一:

private static bool IsBulitinType(Type type)
{
    return (type == typeof(object) || Type.GetTypeCode(type) != TypeCode.Object);
}