我如何判断一个types是“简单”types? 即拥有一个单一的值

typeof(string).IsPrimitive == false typeof(int).IsPrimitive == true typeof(MyClass).IsClass == true typeof(string).IsClass == true typeof(string).IsByRef == false typeof(MyClass).IsByRef == true // correction: should be false (see comments below) 

我有一个实例化T的新实例的方法,如果它是一个“复杂”类,从一组源数据值填充它的属性。

(a)如果T是一个简单的types(例如一个string或者一个int或者其他类似的东西),那么将执行从源数据到T的快速转换。

(b)如果T是一个类(但不是简单的string),那么我将使用Activator.CreateInstance并做一些reflection来填充字段。

有没有一个简单的方法来判断我应该使用方法(a)还是方法(b)? 这个逻辑将在T作为types参数的generics方法中使用。

string可能是一个特例。

我想我会做…

 bool IsSimple(Type type) { return type.IsPrimitive || type.Equals(typeof(string))); } 

编辑:

有时你需要覆盖更多的例子,比如枚举和小数。 枚举在C#中是一种特殊的types。 小数点就像任何其他结构一样。 结构的问题是它们可能很复杂,可能是用户定义的types,它们可能只是一个数字。 所以你没有其他的机会,除了知道他们区分。

 bool IsSimple(Type type) { return type.IsPrimitive || type.IsEnum || type.Equals(typeof(string)) || type.Equals(typeof(decimal)); } 

处理可空对象也有点棘手。 可空对象本身是一个结构体。

 bool IsSimple(Type type) { if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) { // nullable type, check if the nested type is simple. return IsSimple(type.GetGenericArguments()[0]); } return type.IsPrimitive || type.IsEnum || type.Equals(typeof(string)) || type.Equals(typeof(decimal)); } 

testing:

 Assert.IsTrue(IsSimple(typeof(string))); Assert.IsTrue(IsSimple(typeof(int))); Assert.IsTrue(IsSimple(typeof(decimal))); Assert.IsTrue(IsSimple(typeof(float))); Assert.IsTrue(IsSimple(typeof(StringComparison))); // enum Assert.IsTrue(IsSimple(typeof(int?))); Assert.IsTrue(IsSimple(typeof(decimal?))); Assert.IsTrue(IsSimple(typeof(StringComparison?))); Assert.IsFalse(IsSimple(typeof(object))); Assert.IsFalse(IsSimple(typeof(Point))); // struct in System.Drawing Assert.IsFalse(IsSimple(typeof(Point?))); Assert.IsFalse(IsSimple(typeof(StringBuilder))); // reference type 

除了Stefan Steinegger答案:在.NET Core中.IsPrimitive等不再是Type的成员,它们现在是TypeInfo的成员。 那么他的解决scheme就会变成:

 bool IsSimple(TypeInfo type) { if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) { // nullable type, check if the nested type is simple. return IsSimple((type.GetGenericArguments()[0]).GetTypeInfo()); } return type.IsPrimitive || type.IsEnum || type.Equals(typeof(string)) || type.Equals(typeof(decimal)); } 

有一个比原始types更普遍的types,ValueType包含比原始的更多,如枚举,小数和其他这样的东西ValueType 。 以下是我写的识别复杂types的函数,可能适合您的需求。

  public static bool IsComplex(Type typeIn) { if (typeIn.IsSubclassOf(typeof(System.ValueType)) || typeIn.Equals(typeof(string))) //|| typeIn.IsPrimitive return false; else return true; } 

对不起,复活一个真正的旧线程,但由于这仍然在谷歌networkingsearch排名高,想要得到一个更直接和有效的解决scheme增加:

 if(System.Type.GetTypeCode(typeof(int)) == TypeCode.Object) { // Do what you will... } 

这可能并不重要,但是这听起来像是你正在抛弃一些情况:

  1. 有转换的复杂types
  2. 值types没有无参数的构造函数。 示例如下:

可能还有更多,但我认为你是以过分限制的方式来划分问题空间的。

  public class Person { private string _name; private int _age; public Person(string name, int age) {_name = name; _age = age;} // Remainder of value implementation } 

如果我记得正确,string不是原始的。 即使有关键字,string也是一个对象。 您打给IsPrimitive的电话会准确地告诉您是否有原始物品。