4

MSDN 文档:MemberInfo.GetCustomAttibutes Method (Type, Boolean)在备注中声明:

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

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

令我困惑的是这个设计。

为什么他们似乎会在 2 种成员类型上任意忽略继承属性?

如果有人能对此有所了解,我将不胜感激。

4

1 回答 1

1

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

从根本上说,属性和事件是元数据的构造,旨在供以 CLI 为目标的工具使用,并且不受 VES 本身的直接支持。因此,确定名称隐藏、继承等规则是源语言编译器和反射库(参见第 IV 部分)的工作。源编译器应生成直接访问由事件和属性命名的方法的 CIL,而不是事件或属性本身。

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

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

于 2010-06-23T17:50:52.910 回答