Pergunta

Eu estou tentando descobrir de se há uma sintaxe simples para a conversão de um grupo de método para uma expressão. Parece bastante fácil com lambdas, mas não se traduz em métodos:

Dada

public delegate int FuncIntInt(int x);

todos os abaixo são válidos:

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

Mas se eu tentar o mesmo com um método de instância, ele quebra as expressões:

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 os dois últimos não compilar com "Não é possível converter grupo de método 'AFuncIntInt' para tipo não-delegado 'System.Linq.Expressions.Expression <...>'. Você pretende invocar o método?"

Então, há uma boa sintaxe para a captura de um grou método em uma expressão?

graças, Arne

Foi útil?

Solução

Como sobre isso?

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

Outras dicas

Também é possível fazê-lo usando NJection.LambdaConverter um delegado para LambdaExpression conversor 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)
    } 
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top