动态创建lambda动作委托

时间:2017-01-01 16:24:33

标签: c# reflection lambda delegates

我可以创建一个带有lambda表达式的Action委托,例如this()=>当我有目标,MethodInfo和传入的参数时,动态方法(args)?

假设我有一个带有int参数的方法,并希望分配一个Action委托来调用它,参数为1,因此Action action =()=>方法(1),但我想动态地做。您可以创建一个委托并分配动作来动态调用它,或者指定它来调用该方法,但性能很糟糕。

public class DelegateData
{
    public object target;
    public MethodInfo method;
    public object[] args;
}

1 个答案:

答案 0 :(得分:0)

想出来。使用表达式非常简单,以这种方式创建委托当然非常慢(10.000次迭代几乎是1秒),但之后,委托的速度只是自然创建时的两倍。 lambda.Compile是罪魁祸首,但我认为没办法。

var arguments = args.Select(a => Expression.Constant(a)).ToArray();
var lambda = Expression.Lambda(Expression.Call(Expression.Constant(target), method, arguments));
var result = (Action)lambda.Compile();