14

这是如何获取可选参数的默认值的后续问题?

文档中, 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!

那么鉴于我的测试显示(全部在反射上下文中)根本没有区别,有什么区别?

4

1 回答 1

11

“在反射的上下文中”和“仅反射的上下文”之间存在细微但显着的区别。“仅反映上下文”指的是非常具体的东西:

这是一种加载程序集仅用于检查的方法,并且具有不需要加载甚至不存在任何依赖程序集的明显优势。

由于您似乎有意执行一些您正在反射的代码,因此仅反射上下文对您的用处有限。

于 2013-04-24T07:45:30.927 回答