C# 如何使用类型调用默认值(T)?

C# 如何使用类型调用默认值(T)?,c#,.net,reflection,C#,.net,Reflection,在c#中,我可以使用default(T)获取类型的默认值。我需要在运行时从系统中获取默认类型。type。我该怎么做 例如,与此类似的东西(不起作用) 如果试图构建表达式树,请使用: 另一种很容易做到这一点的方法是: object defaultValue = Array.CreateInstance(type, 1).GetValue(0); 丑陋,但它会工作:)注意,很难获得可为null类型的默认值,因为它总是被装箱到null引用 正如评论中所指出的,有些模糊的场景(void和指针类型)并不

在c#中,我可以使用
default(T)
获取类型的默认值。我需要在运行时从
系统中获取默认类型。type
。我该怎么做

例如,与此类似的东西(不起作用)


如果试图构建表达式树,请使用:

另一种很容易做到这一点的方法是:

object defaultValue = Array.CreateInstance(type, 1).GetValue(0);
丑陋,但它会工作:)注意,很难获得可为null类型的默认值,因为它总是被装箱到null引用


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

这很容易,您只需要考虑两种情况:

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

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

您也可以考虑使用<代码> FraveTraseServices GETUNIZILALIZEDIGION < /COD>而不是<代码>激活器。CreateInstance < /代码>,它可能更快。< /P> < P>引用类型返回<代码> null >代码>,对于一个值类型,您可以尝试使用<代码>激活器。CreateInstance < /代码>或调用类型的默认构造函数。< /P>

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

   return null;
}

你试过运行你的代码吗?它不会工作,原因是值类型(通常)没有默认构造函数。他们用C#写,但这是虚构的;在CLR级别上没有,并且在IL中使用了
initobj
。@Pavel,你说得对,我从未意识到没有真正的默认构造函数。。。我把它改为Activator.CreateInstance,在写完我的问题后不久,它就工作得很好了,我提出了
return Expression.Lambda(Expression.Convert(Expression.Default(type)、typeof(object))).Compile(),但你的要好得多。@Giddy:这将是一种非常昂贵的方法,因为每次调用都要将表达式树编译为IL(然后JIT必须将其编译为本机)。是的,我同意。这就是为什么我不使用它,而是使用madgnome的解决方案。尽管如此,促使我使用他的代码的不是性能,而是更短、可读性更强的代码。性能对我的场景来说并不是什么大问题。我正在生成表达式树以用于Mindscape Lightspeed,但它们的查询提供程序不支持
DefaultExpression
,因此我需要实际值放入
ConstantExpression
。稍有挑剔,指针类型的behviour不同
default(int*)
返回
IntPtr.Zero
,而
default(typeof(int*))
抛出。我发现的另一个模糊区域是针对
System.Void
,您不能执行
default(Void)
,而
default(typeof(Void))
返回null。没什么大不了的,只是以防万一有人想照顾。@nawfal:添加了一条注释,谢谢。
public static object GetDefaultValue(Type type)
{
    if (type.IsValueType)
    {
        return Activator.CreateInstance(type);
    }
    else
    {
        return null;
    }
}
public static object Default(Type type)
{
   if(type.IsValueType)
   {
      return Activator.CreateInstance(type);
   }

   return null;
}