如果类型只被称为System.Type,如何获取类型的默认值?

时间:2009-08-15 04:37:17

标签: c# generics default

如果我想要一个返回给定类型的默认值的方法,并且该方法是通用的,我可以返回一个默认值,如下所示:

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

如果我只将类型作为System.Type对象,可以执行类似的操作吗?

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

3 个答案:

答案 0 :(得分:68)

因为你真的只需要担心值类型(引用类型只是null),你可以使用Activator.CreateInstance来调用它们的默认构造函数。

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

编辑:Jon(当然)是正确的。 IsClass并非详尽无遗 - 如果False是一个界面,则会返回type

答案 1 :(得分:7)

以下是我通常的做法。这避免了整个'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);
}

答案 2 :(得分:1)

如果没有泛型,您不能保证该类型具有无参数构造函数,但您可以使用反射搜索一个:

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

我在一个控制台应用程序中尝试了这个,并返回该类的“默认”实例 - 假设它是一个类。如果您需要它也适用于参考类型,您还需要一种额外的技术。