2012-12-10 41 views
3

重写属性的继承属性时有很好的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不会继承属性?


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

+0

好了,你的第一个例子是完全有_No relation_到'ParentClass.MyString'宣布的新成员;没有压倒一切,自然属性不会被共享。我知道用反射,你可以获得属性,或者专门针对目标类型进行声明,或者将其扁平化以包含来自任何继承类的所有属性。 –

+0

@ChrisSinclair你是对的。我的措辞是不正确的。 – MPelletier

回答

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 
+0

+1这是一个有趣的解决方案,但它需要更多的工作,无论是消费类还是反射。如果有一种方法简单地*撕裂*属性或掩盖它... – MPelletier

+1

@MPelletier当然,这是一个折衷。如果你可以在专门的课程中分离反思,或者在基础课程中更好,你只需要做一次。另一种方法是创建另一个指定相反的属性。像NonSerializedAttribute一样,它通知序列化程序一个可序列化类的特定字段不应被序列化。这种方法也需要额外的工作。 –