【问题标题】:Is there a function to check if an object is a builtin data type?是否有检查对象是否为内置数据类型的功能?
【发布时间】:2009-07-11 22:21:42
【问题描述】:

我想看看一个对象是否是 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);
    }

【问题讨论】:

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


    【解决方案1】:

    不直接,但您可以进行以下简化检查

    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 的解决方案。原因很简单,检查我必须对我的解决方案进行的编辑次数,因为我忘记了哪些类型是或不是原语。更容易在一组中明确列出它们。

    【讨论】:

    • 您还想检查它 not 是否是 IntPtr,它是原始的但不是内置的。这就是为什么我不太喜欢这种方法的原因——您需要比较两个列表并找出差异,而显式设置只是意味着从 C# 规范中逐字复制列表:)
    • @Jared:因此删除了我的评论 :) (对于那些没有碰巧抓住它的人,Jared 的回答最初不包括小数。我在他修复它时发表了评论...... )
    • 确实如此。 native int (System.IntPtr) 是一个原始的 .NET 类型。
    • @Jon,arg,忘记了 IntPtr。但证据在编辑中,更容易明确列出
    • Guid 怎么样?
    【解决方案2】:

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

    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 + 应用于方法参数等

    【讨论】:

    • 我想递归地创建一个 PropertyDescriptorCollection,我需要检查该类型是否是内置的。如果其中一个属性不是内置类型,我想创建一个新集合。我会在问题中添加我想要做的事情,也许这会有所帮助
    • 但是为什么这个决定要基于 C# 规范呢?为什么要以一种方式处理 Decimal,而以不同的方式处理 DateTime 或 Guid?
    • 对,不应该,这是我的疏忽。 System.ValueType 也应该被检查。
    • 那么您真的只是对它是值类型还是引用类型感兴趣?如果是这样,请使用 Type.IsValueType。您可能还想要特殊情况的字符串...
    • 很好,是的,这就是我要找的,所以我只需要额外检查字符串和对象,对吧?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-10-18
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      • 2017-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多