为什么GetCustomAttributes(true)
没有AttributeUsageAttribute.Inherited = false
返回属性?我可以看到文档中没有任何内容表明这两者应该相互作用。以下代码输出0
。
class Program
{
[AttributeUsage(AttributeTargets.Class, Inherited = false)]
class NotInheritedAttribute : Attribute { }
[NotInherited]
class A { }
class B : A { }
static void Main(string[] args)
{
var attCount = typeof(B).GetCustomAttributes(true).Count();
Console.WriteLine(attCount);
}
}
答案 0 :(得分:1)
Type.GetCustomAttributes()
是一种调用Attribute.GetCustomAttributes()的扩展方法,后者调用GetCustomAttributes
并将参数inherit
设置为true
。因此,默认情况下,您在使用GetCustomAttributes()
时已经继承。
唯一的区别是GetCustomAttributes()
和GetCustomAttributes(inherit: false)
之间。后者将禁用继承属性的继承,而前者只传递那些可继承的属性。
您不能强制本身不可继承的属性可以继承。
有关快速摘要,请参阅以下示例:
void Main()
{
typeof(A).GetCustomAttributes().Dump(); // both
typeof(A).GetCustomAttributes(inherit: false).Dump(); // both
typeof(B).GetCustomAttributes().Dump(); // inheritable
typeof(B).GetCustomAttributes(inherit: false).Dump(); // none because inheritance is prevented
typeof(C).GetCustomAttributes().Dump(); // both
typeof(C).GetCustomAttributes(inherit: false).Dump(); // both because C comes with its own copies
}
[AttributeUsage(AttributeTargets.Class, Inherited = true)]
public class InheritableExampleAttribute : Attribute { }
[AttributeUsage(AttributeTargets.Class, Inherited = false)]
public class NonInheritableExampleAttribute : Attribute { }
[InheritableExample]
[NonInheritableExample]
public class A { }
public class B : A { }
[InheritableExample]
[NonInheritableExample]
public class C : A { }