如果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,那么你需要一个额外的技术。