我可以创建一个带有lambda表达式的Action委托,例如this()=>当我有目标,MethodInfo和传入的参数时,动态方法(args)?
假设我有一个带有int参数的方法,并希望分配一个Action委托来调用它,参数为1,因此Action action =()=>方法(1),但我想动态地做。您可以创建一个委托并分配动作来动态调用它,或者指定它来调用该方法,但性能很糟糕。
public class DelegateData
{
public object target;
public MethodInfo method;
public object[] args;
}
答案 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();