【问题标题】:Merge two objects of the same class that has nested classes合并具有嵌套类的同一类的两个对象
【发布时间】:2012-11-01 01:19:37
【问题描述】:

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

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。 这是实现这一目标的最佳方法吗?如何在编译器安全的情况下让它覆盖子类。 还是我以错误的方式接近这个?

【问题讨论】:

    标签: c# generics merge nested-class propertyinfo


    【解决方案1】:

    试试merging with Automapper

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

    【讨论】:

    • 谢谢,看到有一个专门用于解决这类问题的整个 codeplex 是一件好事,但如果不安装 nuget 包,我似乎找不到一种简单的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多