如何用类型调用default(T)?

时间:2010-09-14 08:45:09

标签: c# .net reflection

在c#中,我可以使用default(T)来获取类型的默认值。我需要在System.Type的运行时获取默认类型。我怎么能这样做?

E.g。有些事情(这不起作用)

var type = typeof(int);
var defaultValue = default(type);

3 个答案:

答案 0 :(得分:9)

对于引用类型return null,对于值类型,您可以尝试使用Activator.CreateInstance或调用该类型的默认构造函数。

public static object Default(Type type)
{
   if(type.IsValueType)
   {
      return Activator.CreateInstance(type);
   }

   return null;
}

答案 1 :(得分:6)

如果您正在尝试构建表达式树,请使用Expression.Default

Expression expression = Expression.Default(type);

这样做的另一种方式是:

object defaultValue = Array.CreateInstance(type, 1).GetValue(0);

丑陋,但它会工作:)请注意,很难获得可空类型的默认值,因为它总是被装箱为空引用。

正如评论中所指出的,有一些模糊的场景(void和指针类型),这些场景不等同,但它们是极端情况:)

答案 2 :(得分:3)

这很简单,你只需考虑2个案例:

  • 引用类型:默认值始终为null
  • 值类型:您可以使用Activator.CreateInstance

    轻松创建实例
    public static object GetDefaultValue(Type type)
    {
        if (type.IsValueType)
        {
            return Activator.CreateInstance(type);
        }
        else
        {
            return null;
        }
    }
    

你也可以考虑使用FormatterServices.GetUninitializedObject代替Activator.CreateInstance,它可能更快。