5

自動生成されたオブジェクトの大規模なコレクションがあります。それらはすべて異なる、関連のないクラスですが、すべてのオブジェクトはいくつかの基本的なプロパティ (名前、ID など) を共有しています。私はこれらのオブジェクトの生成を制御していないため、残念ながらインターフェイスを実装するという理想的なアプローチを取ることはできません。これらのオブジェクトの任意の 1 つを渡し、これらの共通プロパティを使用して何かを行うメソッドを作成したいと思います。

一般的な考え方は次のようになります。

someObj a = new someObj();
a.name = "sara";
diffObj b = new diffObj();
b.name = "joe";
string phrase = string.Format("I am with {0} and {1}", 
    getName(a), getName(b));

private string getName(object anyObjWithName)
{
    return anyObjWithName.name;
}

当然これは機能しませんが。

ジェネリック メソッドが答えを保持している可能性があると思いましたが、現在の型でそれを呼び出すことができる唯一の方法は を使用genericMethod.Invokeすることであり、メソッドで渡されたオブジェクトのプロパティを解決できないという同じ問題が依然としてあります。これは、実行時にのみ既知の型引数を持つジェネリック メソッドの呼び出しや、指定された Type オブジェクトでジェネリック メソッドを呼び出す方法とは異なります。オブジェクトのプロパティではなく、型または型のプロパティのみがメソッドで使用されます。

これが (非常に) エラーを起こしやすいことは承知していますが、遭遇したすべてのオブジェクトが共通のプロパティを操作することを保証できます。

4

6 に答える 6

2

D Stanley が述べたように dynamic を使用したパフォーマンスに不満がある場合は、いつでもFastMemberを試すことができます。

使用を開始するために知っておく必要があることは、最初の 2 つのコード例にほとんど示されています。

于 2013-08-12T20:27:10.883 に答える
0

そこに Rube Goldberg デバイスを作成しています。すべてのデータ オブジェクト クラスに単一のインターフェイスを実装させるだけで、それで作業できます。リフレクションをいじるよりもはるかに単純でエラーが発生しにくい。

多くのオブジェクトが共通のプロパティを持っているが、少なくとも共通のインターフェイス上で同じ祖先を共有していないという事実は、設計に何か問題があることを示しています。考え直してください。

于 2013-08-12T20:01:08.547 に答える