GetCustomAttributes继承参数vs AttributeUsage.Inherited

时间:2017-09-29 11:13:49

标签: c# inheritance attributes

为什么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);
    }
}

1 个答案:

答案 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 { }