2017-01-01 63 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();