当我在运行时只知道T时,如何创建和调用Action <t>?</t>

时间:2013-01-19 16:55:50

标签: c# .net c#-4.0 delegates

如何在运行时创建并调用委托Action<T>我将接收委托作为对象,并且只在运行时知道类型?

例如,在In 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 个答案:

答案 0 :(得分: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" });

答案 1 :(得分:2)

那么也许这就是:

    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");

答案 2 :(得分:2)

这应该有效

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

public void Process(object myDelegate, object data)
{
    ((Delegate)myDelegate).DynamicInvoke(data);
}

答案 3 :(得分:1)

你这里没有给出很多上下文,但是你不能把你的Process方法重写为:

public void Process<T>(Action<T> myDelegate, T data)
{
    myDelegate(data);
}