为什么GetCustomAttributes返回object []而不是Attribute []?

时间:2012-03-01 06:16:44

标签: c# .net reflection attributes

好奇,请参阅MemberInfo.GetCustomAttributes。是否暗示它可能包含非属性对象?

3 个答案:

答案 0 :(得分:8)

这是因为CLI规范没有强制从属性派生属性。

II Part 21(第225页)中的规范声明:

  

虽然   任何用户定义的类型都可以用作属性,CLS合规性要求属性是实例   基类为System.Attribute的类型。 CLI预定义了一些属性类型并使用它们来控制   运行时行为。某些语言预定义属性类型以直接表示语言功能   代表在CTS。欢迎用户或其他工具定义和使用其他属性类型。

基本上,CLR本身无法保证结果是属性 - 这仅适用于符合CLS的语言。允许非CLS兼容语言具有任何类型的属性,这意味着ICustomAttributeProvider.GetCustomAttributes(这是已实现的接口)需要提供一种机制来获取非属性派生属性。

答案 1 :(得分:0)

每个MSDN:http://msdn.microsoft.com/en-us/library/kff8s254.aspx

This method ignores the inherit parameter for properties and events. 
To search the inheritance chain for attributes on properties and events, 
use the appropriate overloads of the Attribute.GetCustomAttributes method.

我的理解是它允许你甚至可以自定义一个属性而不从System.Attribute继承但是完全写出你自己的“属性”,具有这种灵活性,你的“属性”只能是继承对象

答案 2 :(得分:0)

除了上面提到的Reed之外,MemberInfo.GetCustomAttributes API允许您指定影响要返回的数组类型的过滤器类型。即,当您指定typeof (MyAttribute)时,结果实际上是MyAttribute[](强制转换为object[])。

现在,当您指定接口类型IMyAttribute时,该数组的类型为IMyAttribute[]。虽然可以将IMyAttribute[]投射到object[],但无法将其投射到Attribute[]。所以,实质上,结果是Attribute[],基于接口的过滤不起作用。

(顺便说一下,新的Attribute.GetCustomAttributes API - 修复了属性和事件的继承解析 - 将Attribute[]作为返回类型。这使得基于接口的过滤变得不可能;在尝试时会出现ArgumentException传入接口类型进行过滤。)