シリアライゼーションに使用される他の誰かによって配信されたいくつかのクラスがあります。これらのクラスは、デフォルト値を持ついくつかのパラメーターで構成されています。他のデフォルト値でそれらを開始する必要があります。次のように実装されます。
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});
}
}
}
ただし、これは、ネストされた SubSubClass ではなく、SubHeader3 クラスの値に対してのみ機能します。これがこれに対する最善の方法ですか、またコンパイラセーフであるためにサブクラスをカバーするにはどうすればよいですか。または、これに間違った方法でアプローチしていますか?