合并具有嵌套类的同一个类的两个对象

时间:2012-11-12 15:40:57

标签: c# generics merge nested-class propertyinfo

我有一些用于序列化的其他人提供的课程。 这些类由许多具有默认值的参数构成。 我需要使用othder默认值启动它们。 它实现如下:

public class Header
{
    public class SubHeader1
    {
        [XmlElement("paramone")]
        public string param1{get;set;}
        [XmlElement("paramtwo")]
        public string param2{get;set;}
        [XmlElement("paramthree")]
        public string param3{get;set;}
        [XmlElement("paramfour")]
        public string param4{get;set;}
        public SubHeader1()
        {
            param1 = "theirdefault";
            param2 = "theirdefault";
            param3 = "theirdefault";
            param4 = "theirdefault";
        }
    }
    public class SubHeader2
    {
        [XmlElement("paramone")]
        public string param1{get;set;}
        [XmlElement("paramtwo")]
        public string param2{get;set;}
        public SubHeader1()
        {
            param1 = "theirdefault";
            param2 = "theirdefault";
        }
    }
    Public class SubHeader3
    {
        public class SubSubHeader
        {
            [XmlElement("paramone")]
            public string param1{get;set;}
            [XmlElement("paramtwo")]
            public string param2{get;set;}
            [XmlElement("paramthree")]
            public string param3{get;set;}
            [XmlElement("paramfour")]
            public string param4{get;set;}
            ...
            [XmlElement("paramtwentyfive")]
            pulic string param25{get;set;}
            public SubHeader1()
            {
                param1 = "theirdefault";
                param2 = "theirdefault";
                param3 = "theirdefault";
                param4 = "theirdefault";
                ...
                param25 = "theirdefault";
            }
        }
        [XmlElement("paramone")]
        public string param1{get;set;}
        [XmlElement("subsubheader")]
        public SubSubHeader SSubHeader;
        public SubHeader3()
        {
            SSubHeader = new SubSubHeader();
            param1 = "theirdefault";
        }
    }
    [XmlElement("subheaderone")]
    public SubHeader1 SubHeaderOne;
    [XmlElement("subheadertwo")]
    public SubHeader2 SubHeaderTwo;
    [XmlElement("subheaderthree")]
    public SubHeader3 SubHeaderThree;
    public Header()
    {
        SubHeaderOne = new SubHeader1();
        SubHeaderTwo = new SubHeader2();
        SubHeaderThree = new SubHeader3();
    }
}

这是继承的每个类的标准。 我还有其他一些需要启动的信息,主要是在子文章中。

我创建了自己的SubHeader3对象,并在其类中创建了一个构造函数(用于测试目的),该构造函数接受此对象。 我尝试使用像这样的泛型来更新默认值

public static void MergeWith<T>(this T primary, T secondary) {
    foreach (var pi in typeof(T).GetProperties()) {
       var priValue = pi.GetGetMethod().Invoke(primary, null);
       var secValue = pi.GetGetMethod().Invoke(secondary, null);
       if (priValue == null || (pi.PropertyType.IsValueType && priValue == Activator.CreateInstance(pi.PropertyType))) {
          pi.GetSetMethod().Invoke(primary, new object[]{secValue});
       }
    }
}

但这仅适用于SubHeader3类中的值,而不适用于嵌套的SubSubClass。 这是解决此问题的最佳方法吗?如何让它涵盖编译器安全的子类。 或者我是以错误的方式接近这个?

1 个答案:

答案 0 :(得分:0)

尝试merging with Automapper

 a.InjectFrom(b)
  .InjectFrom(c)
  .InjectFrom<SomeOtherMappingAlgorithmDefinedByYou>(dOrBOrWhateverObject);