如果types只被称为System.Type,如何得到一个types的默认值?

如果我想要一个返回给定types的默认值,方法是generics的方法,我可以返回一个默认值,如下所示:

public static T GetDefaultValue() { return default(T); } 

如果我只有types作为System.Type对象,我可以做类似的事情吗?

 public static object GetDefaultValue(Type type) { //??? } 

既然你真的只需要担心值types(引用types只是空),你可以使用Activator.CreateInstance来调用它们的默认构造函数。

 public static object GetDefaultValue(Type type) { return type.IsValueType ? Activator.CreateInstance(type) : null; } 

编辑:乔恩(当然)是正确的。 IsClass不够详尽 – 如果type是一个接口,它将返回False

这是我通常如何做到这一点。 这避免了整个“IsValueType”或者完全search构造函数的问题。

 public static object MakeDefault(this Type type) { var makeDefault = typeof(ExtReflection).GetMethod("MakeDefaultGeneric"); var typed = makeDefault.MakeGenericMethod(type); return typed.Invoke(null, new object[] { }); } public static T MakeDefaultGeneric<T>() { return default(T); } 

没有通用的,你不能保证types有一个无参数的构造函数,但你可以使用reflection来search一个:

 public static object GetDefaultValue(Type type) { ConstructorInfo ci = type.GetConstructor( new Type[] {} ); return ci.Invoke( new object[] {} ); } 

我在一个控制台应用程序中尝试了这个,并且它返回了类的“默认”实例 – 假设它是一个类。 如果你需要它也可以用于引用types,那么你需要一个额外的技术。