次のようなプロパティを持つクラスがたくさんあります。
class C1
{
[PropName("Prop1")]
public string A {get;set;}
[PropName("Prop2")]
public string B {get;set;}
[PropName("Prop3")]
public string C {get;set;}
}
class C2
{
[PropName("Prop1")]
public string D {get;set;}
[PropName("Prop2")]
public string E {get;set;}
[PropName("Prop3")]
public string F {get;set;}
}
属性は実際のプロパティを示しますが、C# プロパティの名前は常に一致するとは限りません。C1 と C2 の場合、C1.A は C2.D と同じプロパティです。
これらのクラスは継承チェーンの一部ではなく、私はそれらを制御できないため、変更できません。
"Prop1"、"Prop2"、...、"PropN" にはいくつかの一般的な操作があります。コードをあまり繰り返さずにこれらの操作を記述し、それでも保守可能にするための最良のソリューションは何ですか。
解決策 1 (if ステートメント - 多数)
void OperationWithProp1(object o)
{
string prop1;
C1 class1 = o as C1;
if (class1 != null)
prop1 = class1.A;
C2 class2 = o as C2;
if (class2 != null)
prop1 = class2.D;
// Do something with prop1
}
解決策 2 (オーバーロード - 多数)
void OperationWithProp1(string prop1)
{
// Do something with prop1
}
void RunOperationWithProp1(C1 class1)
{
OperationWithProp1(class1.A);
}
void RunOperationWithProp1(C2 class2)
{
OperationWithProp1(class2.D);
}
解決策 #3 (反射) - これらの操作のそれぞれが数千回呼び出され、数百の操作があるため、パフォーマンスが心配です
void OperationWithProp1(object o)
{
// Pseudo code:
// Get all properties from o that have the PropName attribute
// Look if any attribute matches "Prop1"
// Get the value of the property that matches
// Do something with the value of the property
}
どのソリューションを選択しますか?またその理由は? 他のパターンを考えていますか?
明確化のために編集:
多くのクラスは数十のクラスを意味します
多くのプロパティは、30 ~ 40 個のプロパティ/クラスを意味します