ParameterInfo.DefaultValue和ParameterInfo.RawDefaultValue之间的区别

naw*_*fal 10 .net reflection default-value optional-parameters

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

文档中,DefaultValue:

如果参数具有默认值,则获取一个指示默认值的值.

此属性仅在执行上下文中使用.在仅反射上下文中,请使用RawDefaultValue属性.

如果未在方法调用中指定实际值,则使用默认值.参数可以具有null的默认值.这与未定义默认值的情况不同.

文档中,RawDefaultValue:

如果参数具有默认值,则获取一个指示默认值的值.

此属性可以在执行上下文和仅反射上下文中使用.

如果未在方法调用中指定实际值,则使用默认值.参数可以具有null的默认值.这与未定义默认值的情况不同.

文档是如此相似,除了一个用于反射上下文而另一个用于反射上下文.那是什么区别?何时DefaultValue使用时没有反射?我的意思是如何在没有反射的情况下获得默认值?我错过了什么吗?

更新

我创建了两个这样的重载:

public void Required(string value)
{

}
public void Optional(string value = "", int i = -1)
{

}
Run Code Online (Sandbox Code Playgroud)

我测试过:

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!
Run Code Online (Sandbox Code Playgroud)

那么鉴于我的测试显示(所有在反射环境中)没有任何区别,有什么区别?

Ric*_*key 8

"在反思的背景下"和"仅反射的背景"之间存在微妙但显着的差异."仅反思上下文"指的是非常具体的内容:

这是一种仅用于检查加载组件的方法,并且具有不需要加载任何相关组件或甚至不存在的独特优点.

由于您似乎打算执行您正在反映的某些代码,因此仅反射上下文对您的使用有限.

  • 那么,如果你不在仅反射上下文中,为什么不使用`RawDefaultValue`? (3认同)