【问题标题】:Override an inherited class attribute in a subclass覆盖子类中继承的类属性
【发布时间】:2012-12-10 18:26:42
【问题描述】:

有一个很好的question 覆盖属性的继承属性。

假设一个属性:

[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 不继承该属性?


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

【问题讨论】:

  • 嗯,您的第一个示例是声明一个与ParentClass.MyString 完全没有关系 的新成员;没有压倒一切,自然不会共享属性。我知道通过反射,您可以获得专门针对目标类型声明的属性展平以包含来自任何继承类的所有属性。
  • @ChrisSinclair 你是对的。我的措辞不正确。

标签: c# custom-attributes


【解决方案1】:

您可以复制您引用的问题的答案之一中提到的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 属性,并且只有当它是 true 时您才能实际使用它。

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

[MyAttribute]
public class ParentClass
[MyAttribute(false)]    
public class ChildClass; //Don't want MyAttribute

【讨论】:

  • +1 这是一个有趣的解决方案,但它需要更多的工作来消耗类并对其应用反射。如果有办法简单地 rip 属性或屏蔽它...
  • @MPelletier 当然,这是一个权衡。如果您可以在专用类中隔离反射,或者在基类中更好地隔离反射,那么您只需执行一次。另一种方法是创建另一个指定相反的属性。就像 NonSerializedAttribute 通知序列化程序不应序列化可序列化类的特定字段一样。不过,这种方法也需要额外的工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多