3

パラメータとしてメソッドを送信する方法はありますか?署名や返品を気にするのではなく、あらゆる種類の方法でそれを行う必要があります。このようなことを言ってください(アイデアのためだけに悪いコード):

public class Foo
{
...
void TestMethod(DontKnowWhatToPutHere theDelegate) {}
...
}

...

foo.TestMethod(-foo.AnotherMethod(1,2)-);
foo.TestMethod(-foo.AnotherMethod("I don't care method signature nor returning type")-);

Actionパラメータとして使用してみましたが、うまくいきませんでした。

私がする必要があるのは、任意のメソッドを関数に送信し、リフレクションを使用してメソッド名とパラメーターを取得することです。そのため、皆さんが理解できる別の方法があれば、私も喜んでそれについて聞きます。

4

3 に答える 3

9

いいえ。コンパイラは、変換先の特定のデリゲートを常に識別できる必要があり、すべてのメソッドシグネチャと互換性のある単一のデリゲートタイプはありません。、などを使用してActionからAction<T>Action<T1, T2>などを使用することで長い道のりをたどることができますが、パラメータに関してはそれでも失敗します。さらに、考慮すべき過負荷の解決策があります。Func<TResult>Func<T1, TResult>outref

さらに、構文はメソッド呼び出しの結果を渡します。これは、最初にメソッドを渡すことと同じではありません。-(これは、構成された構文のように見える接頭辞/接尾辞を無視しています。)

使用できるのは、メソッド呼び出しをラップすることです。Expression<Action>

void TestMethod(Expression<Action> action)
{
    ...
}

それで:

foo.TestMethod(() => foo.AnotherMethod(1,2));

次に、式ツリーTestMethodを調べて、それがメソッド呼び出しであることを確認し、ターゲット、パラメーターなどを計算します。詳細については、式ツリーのMSDNページを参照してください。

于 2012-10-01T16:50:15.330 に答える
4

MethodInfoオブジェクトを渡すことができます

void TestMethod(MethodInfo methodInfo, object methodObject, object[] parameters)
{
    methodInfo.Invoke(methodObject, parameters);
}
于 2012-10-01T16:51:36.143 に答える
0
public class Foo
{
   void TestMethod(Action<int, int> theDelegate) {}
   void TestMethod(Action<string> theDelegate) {}
}

foo.TestMethod(() => foo.AnotherMethod(1,2));
foo.TestMethod(() => foo.AnotherMethod("I don't care method signature nor returning type"));
于 2012-10-01T16:51:52.680 に答える