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