如果我想要一个返回给定类型默认值的方法,并且该方法是泛型的,我可以像下面这样返回默认值:
public static T GetDefaultValue()
{
return default(T);
}
如果我只有System.Type
对象,我能做类似的事情吗?
public static object GetDefaultValue(Type type)
{
//???
}
由于你只需要担心值类型(引用类型将会是 null),所以可以使用 Activator.CreateInstance
在它们上面调用默认构造函数。
public static object GetDefaultValue(Type type) {
return type.IsValueType ? Activator.CreateInstance(type) : null;
}
编辑:Jon 当然是正确的。IsClass
不够全面,如果type
是接口,它会返回 False
。
这是我通常的做法。这样可以避免整个“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[] {} );
}
Type.GetDefaultValue()
的新方法,但它没有出现在任何MSDN文档中。 - RyanSystem.Runtime.Serialization.FormatterServices.GetUninitializedObject
实际上更准确。 - Ryan