考虑以下场景:
- 基属性类
BaseAttribute
有一个AttributeUsageAttribute
指定它是不可继承的 (Inherited = False
)。 - 派生属性类
DerivedAttribute
继承自该基属性类。 - 基域类
Base
应用了派生属性。 - 从基域类
Derived
继承的域类被要求提供其自定义属性,包括继承的属性 (inherit: true
)。
下面是对应的代码:
using System;
using System.Linq;
namespace ConsoleApplication26
{
class Program
{
static void Main ()
{
var attributes = typeof (Derived).GetCustomAttributes (true);
foreach (var attribute in attributes)
{
Console.WriteLine (
"{0}: Inherited = {1}",
attribute.GetType().Name,
attribute.GetType().GetCustomAttributes (typeof (AttributeUsageAttribute), true).Cast<AttributeUsageAttribute>().Single().Inherited);
}
}
}
[AttributeUsage (AttributeTargets.All, Inherited = false)]
public class BaseAttribute : Attribute
{
}
public class DerivedAttribute : BaseAttribute
{
}
[Derived]
public class Base
{
}
public class Derived : Base
{
}
}
在这种情况下,GetCustomAttributes
API 返回DerivedAttribute
该类的一个实例。我本来希望它不会返回该实例,因为http://msdn.microsoft.com/en-us/library/system.attributeusageattribute.aspx说它AttributeUsageAttribute
本身是可继承的。
现在,这是一个错误,还是预期/记录在某处?
注(2013-02-20):实验表明,类的AttributeTargets
部分BaseAttribute
确实是类继承的DerivedAttribute
。例如,当我将允许的目标更改为 时BaseAttribute
,AttributeTargets.Method
C# 编译器将不允许我应用DerivedAttribute
到一个类。因此,该Inherited = false
部分不被 继承是没有意义的,DerivedAttribute
因此我倾向于认为GetCustomAttributes
.