继承属性

时间:2012-04-27 09:25:12

标签: c# .net inheritance attributes

属性代码

[AttributeUsage(AttributeTargets.Property, Inherited = true)]
class IgnoreAttribute : Attribute
{
}

基础课程

abstract class ManagementUnit
{
    [Ignore]
    public abstract byte UnitType { get; }
}

主要课程

class Region : ManagementUnit
{
    public override byte UnitType
    {
        get { return 0; }
    }

    private static void Main()
    {
        Type t = typeof(Region);
        foreach (PropertyInfo p in t.GetProperties())
        {
            if (p.GetCustomAttributes(typeof(IgnoreAttribute), true).Length != 0)
                Console.WriteLine("have attr");
            else
                Console.WriteLine("don't have attr");
        }
    }
}

输出: don't have attr

解释为什么会这样?毕竟,它必须继承。

2 个答案:

答案 0 :(得分:5)

  

继承标志指示属性是否可以继承。   此值的默认值为false。但是,如果继承的标志是   设置为true,其含义取决于AllowMultiple的值   旗。如果inherited标志设置为true并且AllowMultiple标志   如果为false,则该属性将覆盖继承的属性。   但是,如果继承的标志设置为true且AllowMultiple   flag也设置为true,属性累积在成员上。

来自http://aclacl.brinkster.net/InsideC/32ch09f.htm

查看“指定继承属性规则”一章

编辑:检查Inheritance of Custom Attributes on Abstract Properties 第一个答案:

  

这是不查看父级的GetCustomAttributes()方法   声明。它只查看应用于指定的属性   构件。

答案 1 :(得分:0)

PropertyInfo.GetCustomAttributes中的继承标志会被属性和事件忽略,如下所示:https://msdn.microsoft.com/en-us/library/dwc6ew1d.aspx。但是您可以使用Attribute.GetCustomAttributes重载之一来启用属性(或事件)的继承。

http://blog.seancarpenter.net/2012/12/15/getcustomattributes-and-overridden-properties/

中详细讨论了这个问题