2009-06-16 9 views
6

Estoy intentando averiguar si hay una sintaxis simple para convertir un grupo de métodos en una expresión. Parece bastante fácil con lambdas, pero no se traduce en métodos:Convertir grupo de métodos en expresión

Dadas

public delegate int FuncIntInt(int x); 

todos de los siguientes son válidos:

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

pero si trato de la misma con una método de instancia, se descompone en las expresiones:

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 

Ambos dos últimos no se compilan con "C anotar convertir el grupo de métodos 'AFuncIntInt' al tipo no delegado 'System.Linq.Expressions.Expression < ...>'. ¿Se tiene la intención de invocar el método?"

Entonces, ¿hay una buena sintaxis para la captura de un grou método en una expresión?

gracias, Arne

Respuesta

6

¿Qué tal esto?

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

Dooh ... Me siento estúpido ahora. Eso funciona perfectamente. Gracias –

+2

¿Alguna vez encontró una sintaxis más agradable para esta? No entiendo completamente por qué el compilador no puede encontrar el grupo de métodos de una Expresión > cuando puede resolverlo para Func .. – skrebbel

+0

Mi suposición es que foo.AFuncIntInt es un grupo de métodos, no una expresión y no hay conversiones automáticas de grupo de métodos a expresión, sin embargo, hay una conversión automática para aceptar un lambda como un grupo de métodos o una expresión –

0

También es posible hacerlo usando NJection.LambdaConverter un delegado en el convertidor LambdaExpression Biblioteca

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) 
    } 
} 
Cuestiones relacionadas