4

关于覆盖属性的继承属性有一个很好的问题。

假设一个属性:

[AttributeUsage(AttributeTargets.All, Inherited = true)]
public class MyAttributeAttribute : Attribute

//...

public class ParentClass
{
    [MyAttribute]
    public String MyString;
}

public class ChildClass : ParentClass
{
    new public String MyString; //Doesn't have MyAttribute
}

但是如果MyAttribute设置为一个类呢?

[MyAttribute]
public class ParentClass

public class ChildClass; //Don't want MyAttribute

有没有办法让 ChildClass 不继承该属性?


背景:纯理论。我想让一个属性可继承,并想知道如果某天发生这种情况,我是否可以覆盖它。

4

1 回答 1

3

您可以复制您引用的问题的答案之一中提到的BrowsableAttribute方法。您可以使用布尔值创建一个构造函数,当设置为时false将表示该属性虽然存在,但不应被处理。您还可以添加一个无参数构造函数,将属性设置为true. 这是您最常使用的一种,除非您决定覆盖从基类继承的属性。

[AttributeUsage(AttributeTargets.All, Inherited = true)]
public class MyAttributeAttribute : Attribute
{
    public bool Enabled { get; private set; }

    public MyAttributeAttribute()
        :this(true)
    {
    }

    public MyAttributeAttribute(bool enabled)
    {
        Enabled = enabled;
    }
}

然后,当您反思您的类型并寻找属性时,您可以检查该Enabled属性,并且只有当它是真的时,您才能真正使用它。

您的示例类层次结构将是:

[MyAttribute]
public class ParentClass
[MyAttribute(false)]    
public class ChildClass; //Don't want MyAttribute
于 2012-12-10T18:53:38.043 回答