6

こんにちは、私はこのようなことを達成しようとしています。

Method<TObjectType>(m=>m.GetData); //m is the instance of TObjectType

成功した場合は、この式にアクセスして GetData メソッドを取得し、それを使用して動的 SQL クエリを作成できます。メソッド名を文字列として指定することでこれを行うことができますが、開発者の友人の強い型の世界を壊したくありません。

デリゲートの正確な定義を提供する必要があることはわかっていますが、それでも役に立ちません。

void Method<TObjectType>(Expression<Func<TObjectType, Delegate>> ex){/**/}

アイデアはありますか?

4

2 に答える 2

6

残念ながら、「デリゲート」のようなものはほとんどありません。ほとんどの目的で (特に: a を解決するMethodInfo場合)、厳密に型指定されたデリゲートである必要があります。これはメソッドGetDataはなく、メソッド グループであるためです。メソッドを正確に指定するか、既知のデリゲート型を持っている必要があります (最終的には同じことを行います)。

2 つの実用的なオプションがあります。に作業するobjectか、ジェネリックを追加します。例えば:

void Method<TObjectType>(Expression<Func<TObjectType,object>> ex) {...}

次のように機能します。

void Method<TObjectType, TValue>(Expression<Func<TObjectType,TValue>> ex) {...}

呼び出し元は次を使用します。

Method<Foo>(x => x.GetData());

本当にデリゲートを使用したい場合は、次のように型が予測可能である必要があります。

void Method<TObjectType>(Expression<Func<TObjectType,Func<int>>> ex)

許可:

Method<Foo>(x => x.GetData);

または、(たとえば) メソッドが常にパラメーターなしであることがわかっているが、戻り値の型がわからない場合。たぶん次のようなもの:

void Method<TObjectType, TValue>(Expression<Func<TObjectType,Func<TValue>>> ex)

これにより、次のことが可能になります。

Method<Foo, int>(x => x.GetData);
于 2012-07-31T07:30:34.877 に答える
0

このようなものをお探しですか?

object InvokeMethod(Delegate method, params object[] args){
    return method.DynamicInvoke(args);
}

int Add(int a, int b){
    return a + b;
}

void Test(){
    Console.WriteLine(InvokeMethod(new Func<int, int, int>(Add), 5, 4));
}
于 2012-07-31T07:29:18.203 に答える