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

Pat*_*lug 40 c# generics default

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

public static T GetDefaultValue()
{
  return default(T);
}
Run Code Online (Sandbox Code Playgroud)

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

public static object GetDefaultValue(Type type)
{
  //???
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ett 68

由于您实际上只需要担心值类型(引用类型将为null),因此您可以使用它们Activator.CreateInstance来调用默认构造函数.

public static object GetDefaultValue(Type type) {
   return type.IsValueType ? Activator.CreateInstance(type) : null;
}
Run Code Online (Sandbox Code Playgroud)

编辑:乔恩(当然)是正确的.IsClass并不详尽 - False如果type是接口则返回.

  • 最好使用!type.IsValueType,以处理接口. (21认同)

jon*_*ler 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);
}
Run Code Online (Sandbox Code Playgroud)