2009-06-16 14 views
6

Sto cercando di capire se esiste una sintassi semplice per convertire un gruppo di metodi in un'espressione. Sembra abbastanza facile con lambda, ma non si traduce a metodi:Converti gruppo di metodi in espressione

Attribuite

public delegate int FuncIntInt(int x); 

tutti i sotto sono validi:

Func<int, int> func1 = x => x; 
FuncIntInt del1 = x => x; 
Expression<Func<int, int>> funcExpr1 = x => x; 
Expression<FuncIntInt> delExpr1 = x => x; 

Ma se provo lo stesso con un metodo istanza, si interrompe alle espressioni:

Foo foo = new Foo(); 
Func<int, int> func2 = foo.AFuncIntInt; 
FuncIntInt del2 = foo.AFuncIntInt; 
Expression<Func<int, int>> funcExpr2 = foo.AFuncIntInt; // does not compile 
Expression<FuncIntInt> delExpr2 = foo.AFuncIntInt;  //does not compile 

Entrambi gli ultimi due non riescono a compilare con "C annot metodo di conversione del gruppo 'AFuncIntInt' al tipo non delegato 'System.Linq.Expressions.Expression < ...>'. Hai intenzione di richiamare il metodo?"

Così, c'è una buona sintassi per l'acquisizione di un metodo di Grou in un'espressione?

grazie, Arne

risposta

6

Che ne dici di questo?

Expression<Func<int, int>> funcExpr2 = (pArg) => foo.AFuncIntInt(pArg); 
    Expression<FuncIntInt> delExpr2 = (pArg) => foo.AFuncIntInt(pArg); 
+0

Dooh .. Mi sento stupido ora. Funziona perfettamente. Grazie –

+2

Hai mai trovato una sintassi migliore per questo? Non capisco completamente perché il compilatore non riesca a capire il gruppo di metodi di un'espressione > quando può capirlo per Func .. – skrebbel

+0

La mia ipotesi è che foo.AFuncIntInt sia un methodgroup, non un'espressione e non ci sono conversioni automatiche da methodgroup a expression, tuttavia esiste una conversione automatica per accettare un lambda come un methodgroup o un'espressione –

0

È anche possibile farlo utilizzando NJection.LambdaConverter un convertitore Delegato a LambdaExpression Libreria

public class Program 
{ 
    private static void Main(string[] args) { 
     var lambda = Lambda.TransformMethodTo<Func<string, int>>() 
          .From(() => Parse) 
          .ToLambda();    
    } 

    public static int Parse(string value) { 
     return int.Parse(value) 
    } 
} 
Problemi correlati