C# 是否有函数检查对象是否为内置数据类型?

C# 是否有函数检查对象是否为内置数据类型?,c#,types,built-in,built-in-types,C#,Types,Built In,Built In Types,我想看看一个对象是否是C中的a# 如果可能的话,我不想检查所有这些选项。 也就是说,我不想这样做: Object foo = 3; Type type_of_foo = foo.GetType(); if (type_of_foo == typeof(string)) { ... } else if (type_of_foo == typeof(int)) {

我想看看一个对象是否是C中的a#

如果可能的话,我不想检查所有这些选项。
也就是说,我不想这样做:

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

我试图递归地创建一个PropertyDescriptor集合,其中PropertyDescriptor类型可能不是内置值。所以我想做一些类似的事情(注意:这还不起作用,但我正在努力):

public override PropertyDescriptorCollection GetProperties(属性[]属性)
{
PropertyDescriptorCollection cols=base.GetProperties(属性);
属性列表\u desc=CreatePDList(cols);
返回新属性DescriptorCollection(属性列表\u desc.ToArray());
}
私有列表CreatePDList(PropertyDescriptorCollection dpCollection)
{
List List of_properties_desc=新列表();
foreach(dpCollection中的PropertyDescriptor pd)
{
if(IsBulitin(pd.PropertyType))
{
属性列表描述添加(pd);
}
其他的
{
属性列表描述AddRange(CreatePDList(pd.GetChildProperties());
}
}
返回属性描述的列表;
}
//这是我上述问题的原始答案
私有布尔IsBulitin(类型inType)
{
返回inType.IsPrimitive | | inType==typeof(string)| | inType==typeof(object);
}

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

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的解决方案。原因很简单,请检查由于我忘记的类型是或不是原语而必须对解决方案进行的编辑数量。只需在一个集合中显式列出它们就更容易了

一个简单的方法是将它们显式地列在一个集合中,例如

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

...


if (BuiltInTypes.Contains(typeOfFoo))
{
    ...
}
static readonly HashSet BuiltInTypes=新HashSet
(typeof(object)、typeof(string)、typeof(int);
...
if(内置类型包含(typeofoo))
{
...
}
我不得不问为什么它很重要——我可以理解如果它是一个应用程序,它会有什么不同,但是你能解释一下,如果它是C#本身的应用程序之一,为什么你希望你的应用程序表现不同?这是一个开发工具吗


根据该问题的答案,您可能想在C 4中考虑<代码>动态< /代码>,这不是执行时的类型,而是“代码>系统。对象< /代码> +属性应用于方法参数等。

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

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

您还需要检查它是否不是IntPtr,IntPtr是原始的,但不是内置的。这就是为什么我不太喜欢这种方法-您需要比较两个列表并找出差异,而显式集合只意味着从C#spec:)@Jared:逐字复制列表,因此删除了我的注释:)(对于那些没有注意到它的人来说,Jared最初的回答不包括decimal。我在他修复它时发表了评论…)确实如此。
native int
System.IntPtr
)是一个基本的.NET类型。@Jon,arg,忘记了IntPtr。但证据在编辑中,更容易列出它们。Guid如何?我想递归创建一个PropertyDescriptorCollection,我需要检查该类型是否为内置类型。如果其中一个属性不是内置类型,我想创建一个新集合。我将添加w我想在这个问题上做些什么,也许这会有帮助,但是为什么这个决定是基于C#规范的?为什么你想用一种方式来处理十进制,而用另一种方式来处理DateTime或Guid?是的,不应该,这是我的疏忽。System.ValueType也应该被检查。那么你真的只对什么有兴趣吗是值类型还是引用类型?如果是,请使用type.IsValueType。您可能还需要特殊大小写字符串…很好,是的,这就是我要找的,所以我只需要额外检查字符串和对象,对吗?
private static bool IsBulitinType(Type type)
{
    return (type == typeof(object) || Type.GetTypeCode(type) != TypeCode.Object);
}