如何在运行时创建并调用委托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)
答案 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);
}