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这是一种加载程序集仅用于检查的方法,并且具有不需要加载甚至不存在任何依赖程序集的明显优势。
由于您似乎有意执行您正在反射的某些代码,因此仅反射上下文对您的用处有限。
【讨论】:
很高兴知道。那我会坚持DefaultValue
。 ParameterInfo
类非常具有误导性。是时候对IsOptional
和HasDefaultValue
之间的区别提出另一个问题了
那么,如果您不在仅反射上下文中,为什么不使用RawDefaultValue
?
@svick 在我的情况下,只有执行上下文很重要,除非需要,否则我有实施最低限度的东西的政策:) RawDefaultValue
也很有意义。请标记我的名字,否则我不会收到通知。以上是关于ParameterInfo.DefaultValue 和 ParameterInfo.RawDefaultValue 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章