2014-02-07 98 views
0

我有一個名爲BaseClass的類,它具有各種類型的許多屬性,包括列表和字典。這個類有三個派生類,它們有更多的屬性。這些類已經在一個大的應用程序中使用,所以現在改變設計是不可行的。如何從其基礎對象填充對象的屬性值

所以派生類是這樣的:

public class DerivedClass1 : BaseClass 
{ 
    public string PropertyOne { get; set; } 
} 

public class DerivedClass2 : BaseClass 
{ 
    public string PropertyTwo { get; set; } 
} 

public class DerivedClass3 : BaseClass 
{ 
    public string PropertyThree { get; set; } 
} 

我需要執行多態基於駐留在基類中的屬性,當我反序列化這些類。所以每次將Json對象反序列化爲BaseClass時,我都需要檢查該屬性值並創建正確的具體類。要做到這一點,我需要像PopulateFrom(這BaseClass的情況下,BaseClass的fromObject)的方法,所以我可以這樣調用它:

var deserializedObjet = Serializer.Deserialize(jsonString); 
switch(deserializedObjet.ConcreteType) 
{ 
    case 1: 
     return new DerivedClass1().PopulateFrom(deserializedObjet); 
    case 2: 
     return new DerivedClass2().PopulateFrom(deserializedObjet); 
    case 3: 
     return new DerivedClass3().PopulateFrom(deserializedObjet); 
} 

派生類在JSON字符串的數據。他們所做的是獲得相同的數據,但他們對它們執行不同的操作,或者以不同的方式表示它們,所以我只需要將Json反序列化到BaseClass。

我知道StackTrace.Text有一個類似的方法,但該方法是從版本4添加的,這不是免費的。

+0

如果您將JSON反序列化爲'BaseClass',那麼它將忽略派生類屬性的序列化值。一旦你找出它是哪一個,你就需要反序列化到正確的類。 –

+0

對不起,我可能沒有正確提到這個問題。派生類在Json字符串中沒有數據。他們所做的是獲得相同的數據,但他們對它們執行不同的操作,或者以不同的方式表示它們。 – Aref

回答

0

您可以創建一個必需的類實例,使用反射將當前基礎實例的屬性值複製到新創建的實例中。請在下面找到示例(它必須在編譯前修復)

static void PopulateFrom(this BaseClass dest, BaseClass source) //extension method will not modify legacy code and can be added to the any static class 
{ 
    var properties = source.GetType().GetProperties(public only); 
    foreach (var pi in properties) 
     if (pi.CanRead && pi.CanWrite) 
      pi.SetValue(dest, pi.GetValue(source, null), null); //this will work only for classes inherited from BaseClass 
} 

此外,您可以在BaseClass中覆蓋賦值運算符並使用它複製屬性值。

+0

這也適用於列表和詞典嗎? – Aref

+0

@Aref肯定!您將獲得指向與源對象相同的List1(或Array2)屬性的List1(或Array2)屬性的目標對象,例如不過,我想指出的是,它是不可能序列化字典,你必須添加假KeyValuePair []屬性來獲取字典與XmlSerializer序列化 – oleksa

相關問題