2017-01-01 81 views
0

当我有目标,MethodInfo和参数传入时,是否可以使用类似this()=>方法(args)的lambda表达式创建Action委托?动态创建lambda动作委托

说我有一个方法,采取了一个int参数,并希望分配一个动作委托来调用它的参数1像这样Action Action =()=>方法(1),但我想动态地做到这一点。你可以创建一个委托并分配动作来动态调用它,或者分配它来调用该方法,但是性能很糟糕。

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

可能的重复http://stackoverflow.com/questions/12131301/how-can-i-dynamically-create-an-actiont-at-runtime。 –

+1

你想达到什么目的?对我来说似乎还不太清楚 –

+0

@Nobody创建一个lambda表达式,其中调用一个方法并动态地将其存储在一个Action委托中。 – Martin

回答

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();