2014-02-07 96 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

相关问题