2010-04-23 183 views
2

我有一個在屬性標記的基類中的屬性,我想改變我的每個派生類中的一些屬性。做這個的最好方式是什麼?更改派生類中屬性的值?

從我所知道的,我必須在我的基類中定義屬性爲抽象,並重寫每個基類中的屬性,並重新定義所有屬性。這似乎真的是多餘的,我並不是瘋狂的,因爲我將不得不重複每個派生類中的通用屬性。

這是我想要做的一個簡單的例子。我想在派生類中更改MyAttribute,但將屬性中的所有其他屬性保留在同一個地方(即我不想重新定義XmlElement多次)。這甚至有可能嗎?還是有更好的方法來做到這一點?或者我完全濫用屬性?

using System; 
using System.Xml; 
using System.Xml.Serialization; 

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)] 
public class MyAttribute : System.Attribute 
{ 
    public MyAttribute() {} 

    public string A { get; set; } 

    public string B { get; set; } 
} 

public abstract class BaseClass 
{ 
    public BaseClass() {} 

    [XmlElement("some_property")] 
    [MyAttribute(A = "Value1", B = "Value2")] 
    public string SomeProperty { get; set; } 
} 

public class FirstDerivedClass : BaseClass 
{ 
    //I want to change value B to something else 
    //in the MyAttribute attribute on property SomeProperty 
} 

public class SecondDerivedClass : BaseClass 
{ 
    //I want to change value B to yet another value 
    //in the MyAttribute attribute on property SomeProperty 
} 
+0

「或者我在這裏完全濫用屬性?」 - 從這個角度來看,這就是它的感覺。你使用你的實際屬性是什麼樣的東西? – AakashM 2010-04-23 17:15:08

+0

在一個小項目上,我嘗試了反射,並使用屬性來生成帶有錯誤消息和類似內容的html表單。再次,這可能不是最好的屬性的使用,但嘿,我學到了一些新的東西。 – wsanville 2010-04-23 20:02:53

回答

0

可以使用GetCustomAttributes方法返回要麼所有的屬性繼承,或只是實現類的各個層面。不幸的是,這不會讓你重寫'AllowMultiple = false'屬性。你可能可以創建一個調用GetCustomAttribute兩次的方法,一次使用繼承值,一次不使用。然後,您可以對繼承的值賦予非繼承的值首選項。如果需要,我可以稍後發佈樣本。