2017-01-01 20 views
0

ターゲット、MethodInfo、および引数を渡すときに、this()=>メソッド(args)のようなラムダ式を使用してアクションデリゲートを動的に作成できますか?ラムダアクションデリゲートを動的に作成する

int引数を受け取り、アクションアクション=()=> Method(1)のように引数を1と呼ぶActionデリゲートを割り当てたいメソッドがありましたが、動的に処理したいとします。デリゲートを作成し、それを動的に呼び出すアクションを割り当てることも、メソッドを呼び出すためにアクションを割り当てることもできますが、パフォーマンスはひどいです。

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メソッドが呼び出されたラムダ式を作成し、それをアクションデリゲートに動的に格納します。 – Martin

答えて

0

それがわかりました。表現方法は非常に簡単ですが、この方法でデリゲートを作成することはもちろん非常に遅いです(10.000回の反復で約1秒)が、後で、デリゲートは自然に作成されたときの2倍の速度になります。ラムダコンパイルはここの犯人ですが、私はその周りには何も見えません。

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(); 
関連する問題