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 回答