如果我想要一个返回给定类型的默认值的方法并且该方法是通用的,我可以返回一个默认值,如下所示:
public static T GetDefaultValue()
{
return default(T);
}
如果我只将类型作为System.Type
对象,我可以做类似的事情吗?
public static object GetDefaultValue(Type type)
{
//???
}
由于您真的只需要担心值类型(引用类型将只是空),因此您可以使用Activator.CreateInstance
它们调用默认构造函数。
public static object GetDefaultValue(Type type) {
return type.IsValueType ? Activator.CreateInstance(type) : null;
}
编辑:乔恩(当然)是正确的。IsClass
不够详尽 -False
如果type
是接口,则返回。
这是我通常的做法。这避免了整个“IsValueType”或完全搜索构造函数问题。
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);
}
如果没有泛型,您无法保证该类型具有无参数构造函数,但您可以使用反射来搜索:
public static object GetDefaultValue(Type type)
{
ConstructorInfo ci = type.GetConstructor( new Type[] {} );
return ci.Invoke( new object[] {} );
}
我在一个控制台应用程序中尝试了这个,它返回一个类的“默认”实例——假设它是一个类。如果您还需要它为引用类型工作,您将需要一种额外的技术。