【问题标题】:How to populate the property values of an object from its base object如何从其基础对象填充对象的属性值
【发布时间】:2014-02-07 18:49:02
【问题描述】:

我有一个名为 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(this BaseClass instance, 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 中添加的,它不是免费的。

【问题讨论】:

  • 如果您将 JSON 反序列化为 BaseClass,那么它将忽略派生类属性的序列化值。一旦你弄清楚它是哪个类,你需要再次反序列化到正确的类。
  • 抱歉,我可能没有正确提及这个问题。派生类在 Json 字符串中没有数据。他们所做的是获得相同的数据,但对它们执行不同的操作,或者以不同的方式表示它们。

标签: c# properties populate


【解决方案1】:

您可以创建一个所需的类实例,将属性值从当前基实例复制到新创建的具有反射的实例。请在下面找到示例(必须在编译前修复)

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 中的赋值运算符并使用它复制属性值。

【讨论】:

  • @Aref 确定!您将获得具有 List1(或 Array2)属性的目标对象,该属性指向与源对象相同的 List1(或 Array2)属性,例如但是我想指出,无法序列化 Dictionary,您必须添加假 KeyValuePair[] 属性才能使用 XmlSerializer 序列化字典
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
相关资源
最近更新 更多