2017-05-26 3 views
2

J'essaye de lier un délégué avec les méthodes statiques de la classe Expression à l'exécution. Tout d'abord, les deux missions suivantes travaillent à temps la compilation:Convertir lambda pour déléguer à l'exécution

public delegate void Progress(State value); 

public enum State 
{ 
} 

public void DoStuff(int value) 
{ 
} 

... 

Action<State> action = (State a) => { DoStuff((int)a); }; 
Progress actionDelegate = (State a) => { DoStuff((int)a); }; //this is what I'm trying to achieve 

Je suis en train de lier délégué Progress en utilisant Expression classe comme ceci:

public void CreateDelegate() 
{ 
    var value = Expression.Variable(typeof(State), "a"); 
    var castedValue = Expression.Convert(value, typeof(int)); 
    var method = GetType().GetMethod("DoStuff"); 
    var call = Expression.Call(Expression.Constant(this), method, castedValue); 

    var lamda = Expression.Lambda(call, value); 
    Progress compiled = (Progress)lamda.Compile(); //Invalid cast from Action<State> to Progress  
} 

Lambda.Compile retours Action<State> mais je besoin d'être Progress déléguer. Qu'est-ce que je fais mal?

Répondre

3

Vous pouvez le faire comme ceci:

var lamda = Expression.Lambda<Progress>(call, value); 
Progress compiled = lamda.Compile(); 
+0

OMG cela fonctionne! Merci beaucoup! –