2012-11-12 3 views
3

직렬화에 사용되는 다른 사용자가 제공하는 클래스가 몇 개 있습니다. 이러한 클래스는 기본값이있는 여러 매개 변수로 구성됩니다. 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의 값을 사용할 수 있습니다. 이것이 최선의 방법인가요? 그리고 컴파일러가 안전 할 수있는 서브 클래스를 어떻게 커버 할 수 있을까요? 아니면 잘못된 방식으로 접근하고 있습니까?

답변

0

시도 merging with Automapper 나는 nuget 패키지를 설치하지 않고이 일을하는 간단한 방법을 찾을 수 없습니다 것 같다 BT는

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

덕분에 이러한 종류의 문제에 전념 전체 CodePlex의가 있다고 보는 것은 좋은 일입니다 – dfz0r