Как вызвать лямбда-выражение, используя класс Expression? - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть выражение, которое содержит Func <,> делегат.Я пытаюсь вызвать его и получить целочисленное значение как результат

class Program
{
    static Expression TestMethod(Expression<Func<int, int>> expression)
    {
        return expression;
    }

    static void Main(string[] args)
    {
        var expr = TestMethod(i => i + 1);

        var result = Expression.Lambda<Func<int, int>> (expr).Compile().Invoke(1);

        Console.WriteLine(result);
    }
}

Когда я вызываю выражение, я получаю следующую ошибку:

Необработанное исключение: System.ArgumentException:В System.Linq.Expressions.Expression.ValidateLambdaArgs указано неправильное количество параметров для лямбда-объявления (тип делегата, выражение и тело, параметры ReadOnlyCollection 1 parameters, String paramName) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerable 1) в System.Linq.Expressions.Expression.Lambda [TDelegate] (тело выражения, логическое значение).tailCall, параметры IEnumerable`1) в System.Linq.Expressions.Expression.Lambda [TDelegate] (тело выражения, параметры ParameterExpression []) в TestConsoleApp.Program.Main (String [] args) в E: \ Programming \ portfolio \ TestConsoleApp\ TestConsoleApp \ Program.cs: строка 22 * ​​1008 *

Как получить результат вызова делегата Func <,>?

1 Ответ

0 голосов
/ 29 декабря 2018

Вы оборачиваете лямбду в лямбду ... это не то, что вы хотите.Попробуйте это:

class Program
{
    static void Main(string[] args)
    {
        Expression<Func<int, int>> expr = i => i + 1;

        var result = expr.Compile().Invoke(1);

        Console.WriteLine(result);
    }
}

Если вы хотите использовать "сквозной" TestMethod, вы можете сделать это:

class Program
{
    static Expression TestMethod(Expression<Func<int, int>> expression)
    {
        return expression;
    }

    static void Main(string[] args)
    {
        var expr = TestMethod(i => i + 1);

        var result = ((Expression<Func<int, int>>)expr).Compile().Invoke(1);

        Console.WriteLine(result);
    }
}

Или если вы хотите перестроить лямбду из неуниверсальноговыражение:

class Program
{
    static LambdaExpression TestMethod(Expression<Func<int, int>> expression)
    {
        return expression;
    }

    static void Main(string[] args)
    {
        var expr = TestMethod(i => i + 1);

        var result = Expression.Lambda<Func<int, int>>(expr.Body, expr.Parameters).Compile().Invoke(1);

        Console.WriteLine(result);
    }
}
...