【发布时间】:2011-04-12 01:27:28
【问题描述】:
在 c# 中,我可以使用 default(T) 来获取类型的默认值。我需要在运行时从System.Type 获取默认类型。我该怎么做?
例如与此类似的东西(不起作用)
var type = typeof(int);
var defaultValue = default(type);
【问题讨论】:
标签: c# .net reflection
在 c# 中,我可以使用 default(T) 来获取类型的默认值。我需要在运行时从System.Type 获取默认类型。我该怎么做?
例如与此类似的东西(不起作用)
var type = typeof(int);
var defaultValue = default(type);
【问题讨论】:
标签: c# .net reflection
对于引用类型返回null,对于值类型,可以尝试使用Activator.CreateInstance或调用该类型的默认构造函数。
public static object Default(Type type)
{
if(type.IsValueType)
{
return Activator.CreateInstance(type);
}
return null;
}
【讨论】:
return Expression.Lambda<Func<object>>(Expression.Convert(Expression.Default(type), typeof (object))).Compile()();,但你的要好得多。
如果您要构建表达式树,请使用Expression.Default:
Expression expression = Expression.Default(type);
您可以相当轻松地做到这一点的另一种方法是:
object defaultValue = Array.CreateInstance(type, 1).GetValue(0);
丑陋,但它会工作 :) 请注意,很难获得可空类型的默认值,因为它总是被装箱到空引用。
如 cmets 中所述,有一些模糊的场景(void 和指针类型)它们不等价,但它们是极端情况 :)
【讨论】:
DefaultExpression,因此我需要将实际值放入 ConstantExpression。
default(int*) 返回 IntPtr.Zero,而 Default(typeof(int*)) 抛出。我发现的另一个不为人知的领域是System.Void,你不能做default(void),而Default(typeof(void)) 返回null。没什么大不了的,以防万一有人想照顾..
这很简单,您只需考虑两种情况:
值类型:您可以使用Activator.CreateInstance轻松创建实例
public static object GetDefaultValue(Type type)
{
if (type.IsValueType)
{
return Activator.CreateInstance(type);
}
else
{
return null;
}
}
您也可以考虑使用FormatterServices.GetUninitializedObject 而不是Activator.CreateInstance,它可能更快。
【讨论】:
initobj 在 IL 中使用。