如何创建和调用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<T>当我只知道运行时的T

所有委托类型(例如: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);
}