0

Action<T>実行時にデリゲートをオブジェクトとして受け取り、実行時にしか型がわからない場合、デリゲートを作成して呼び出すにはどうすればよいですか?

たとえば、Foo では、デリゲートを定義し、デリゲートにAction<int>渡すデータと共に、をオブジェクトとして受け取るメソッドに渡したいとします。私が知っているのは不自然ですが、それは私の問題を示すためです。

public void Foo()
{
    Action<int> handler = i => Console.WriteLine(i + 1);
    Process(handler,4)
}

public void Process(object myDelegate, object data)
{

}

そして私は電話したいです

myDelegate(data)
4

4 に答える 4

3

だから多分これは:

    public void processAction<T>(Action<T> action, T item) {
        action(item);            
    }

        Action<int> customAction = (i) => Console.WriteLine(i);
        processAction(customAction, 123);

        Action<string> customAction2 = (s) => Console.WriteLine(s);
        processAction(customAction2, "Frank Borland");
于 2013-01-19T17:03:01.953 に答える
3

すべてのデリゲート型 (例) は、実際にはメソッドAction<string>を持つ型です。Invoke(...)

その呼び出しメソッドをリフレクションで探して呼び出す必要があります。比較的遅いので気をつけてください。

これはそれを行う必要があります:

Action<string> action = s => Console.WriteLine("Hello " + s);
object obj = action;
// Invoking
obj.GetType ().GetMethod ("Invoke").Invoke (obj, new object[] {"World"});

これも機能します。何が速いのかわかりません。チェックしてください。

Action<string> action = s => Console.WriteLine("Hello " + s);
Delegate obj = action;
obj.DynamicInvoke(new [] { "World" });
于 2013-01-19T17:35:27.540 に答える
2

これはうまくいくはずです

Action<int> handler = i => Console.WriteLine(i + 1);
Process(handler, 4);

public void Process(object myDelegate, object data)
{
    ((Delegate)myDelegate).DynamicInvoke(data);
}
于 2013-01-19T18:04:23.457 に答える
1

ここでは多くのコンテキストを提供していませんが、Processメソッドを次のように書き換えることはできません:

public void Process<T>(Action<T> myDelegate, T data)
{
    myDelegate(data);
}
于 2013-01-19T17:18:54.450 に答える