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

Posted

技术标签:

【中文标题】ParameterInfo.DefaultValue 和 ParameterInfo.RawDefaultValue 之间的区别【英文标题】:Difference between ParameterInfo.DefaultValue and ParameterInfo.RawDefaultValue 【发布时间】:2013-04-17 15:22:00 【问题描述】:

这是How do I get default values of optional parameters?的后续问题

来自documentation, DefaultValue:

如果参数有一个表示默认值的值 默认值。

此属性仅在执行上下文中使用。在里面 仅反射上下文,请改用 RawDefaultValue 属性。

在没有指定实际值时使用默认值 方法调用。参数可以有一个默认值为 null。这 与未定义默认值的情况不同。

来自documentation, 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!

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

【问题讨论】:

也许该链接可以帮助您处理仅反射上下文:msdn.microsoft.com/en-us/library/ms172331.aspx 【参考方案1】:

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

How to: Load Assemblies into the Reflection-Only Context

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

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

【讨论】:

很高兴知道。那我会坚持DefaultValueParameterInfo 类非常具有误导性。是时候对IsOptionalHasDefaultValue 之间的区别提出另一个问题了 那么,如果您不在仅反射上下文中,为什么不使用RawDefaultValue @svick 在我的情况下,只有执行上下文很重要,除非需要,否则我有实施最低限度的东西的政策:) RawDefaultValue 也很有意义。请标记我的名字,否则我不会收到通知。

以上是关于ParameterInfo.DefaultValue 和 ParameterInfo.RawDefaultValue 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章