这是如何获得可选参数的默认值?的后续问题。
来自文档,DefaultValue
获取一个值,如果参数具有默认值,则该值指示默认值。 此属性仅在执行上下文中使用。在只反射的上下文中,使用RawDefaultValue属性。 当方法调用中未指定实际值时,将使用默认值。参数的默认值为null。这与未定义默认值的情况不同。
来自文档,RawDefaultValue
获取一个值,如果参数具有默认值,则该值指示默认值。 此属性既可用于执行上下文,也可用于仅反射上下文。 当方法调用中未指定实际值时,将使用默认值。参数的默认值为null。这与未定义默认值的情况不同。
这些文档非常相似,只是其中一个用于反射上下文,而另一个则不是。这有什么区别?什么时候没有反射的情况下使用DefaultValue?我的意思是,我们如何在没有反射的情况下得到默认值?我是不是遗漏了什么?
更新
我创建了两个这样的重载:
public void Required(string value)
{
}
public void Optional(string value = "", int i = -1)
{
}我用以下方法测试:
var f = requiredInfo.GetParameters().Select(p => p.DefaultValue).ToArray();
var g = requiredInfo.GetParameters().Select(p => p.RawDefaultValue).ToArray();
var h = optionalInfo.GetParameters().Select(p => p.DefaultValue).ToArray();
var i = optionalInfo.GetParameters().Select(p => p.RawDefaultValue).ToArray();
//f equals g and h equals i in every way!那么,如果我的测试显示(在反射上下文中)没有任何不同,那么有什么区别呢?
发布于 2013-04-24 07:45:30
“反思语境”与“仅反思语境”之间存在着微妙但显著的差异。“仅反映上下文”指的是非常具体的内容:
这是一种只加载程序集以供检查的方法,它有一个明显的优点,即不需要加载任何依赖程序集,甚至不要求其存在。
由于您似乎有执行您正在反映的一些代码的所有意图,仅反射的上下文对您的使用将是有限的。
https://stackoverflow.com/questions/16185826
复制相似问题