如何创建和调用Action当我只知道运行时的T
本文关键字:运行时 何创建 创建 Action 调用 | 更新日期: 2023-09-27 17:54:23
我如何创建和调用一个委托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)
所有委托类型(例如:Action<string>
)实际上是具有Invoke(...)
方法的类型。
你应该寻找带有反射的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" });
那么也许这个
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");
应该可以了
Action<int> handler = i => Console.WriteLine(i + 1);
Process(handler, 4);
public void Process(object myDelegate, object data)
{
((Delegate)myDelegate).DynamicInvoke(data);
}
您在这里没有给出完整的上下文,但是您不能将Process
方法重写为:
public void Process<T>(Action<T> myDelegate, T data)
{
myDelegate(data);
}