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