2010-06-23 79 views
4

MSDN文档:MemberInfo.GetCustomAttibutes Method (Type, Boolean)国的言论:ICustomAttributeProvider.GetCustomAttributes(...):设计奇怪?

这种方法会忽略属性和事件的继承参数。要在继承链中搜索属性和事件的属性,请使用Attribute.GetCustomAttributes方法的适当重载。

这基本上意味着,这个实现的第二个参数(bool inherit)为事件会员财产成员忽略。但是,调用Attribute.GetCustomAttributes(MemberInfo,Type,bool)多种此操作不会。

让我困惑的是这个设计。

他们为什么看起来会忽略2种成员类型的任意继承属性?

如果有人可以对此有所了解,我会非常感激。

回答

1

这绝对是令人困惑的。严格的答案是属性和事件不会被继承,所以inherited参数没有意义。参考文献ECMA 335 CLI Specification第8.10.3节。

从根本上说,属性和事件 是适合使用的靶向 CLI和不被VES本身直接支持 工具的元数据 的结构。因此, 源语言的作业 编译器和反射库 (请参阅分区IV)确定规则 作为名称隐藏,继承,等等 。源编译器应生成直接访问由事件命名的方法和 属性的CIL,而不是事件或 属性本身。

该规范没有提到编译器应该如何实现这一点。在C#中,属性是通过单独的getter和setter方法实现的,这些方法可以声明为virtualoverride。同样,对于事件,还有单独的addhandler和removehandler方法。

所以简单的答案是,属性和事件是严格的元数据,没有任何实现根据规范。这就是为什么它们不能像方法那样被继承。

+0

哇!很好的答案。 +1和已接受,谢谢。它现在非常有意义! – Aren 2010-06-23 18:40:15

+0

我不得不承认我认为这也很奇怪。我很惊讶这个问题没有得到更多的选票。 – 2010-06-23 19:25:34