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

2

У меня есть выражение, которое содержит 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 (тип 1 parameters, String paramName) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerable, выражение и тело, 1 parameters, String paramName) at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerable 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] (тело выражения, Boolean tailCall, IEnumerable'1 параметры) в System.Linq.Expressions.Expression. Лямбда [TDelegate] (Тело выражения, параметры ParameterExpression []) в TestConsoleApp.Program.Main (аргументы String []) в E:\Programming\portfolio\TestConsoleApp\TestConsoleApp\Program.cs: строка 22

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

Теги:
delegates
expression

1 ответ

1
Лучший ответ

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

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);
    }
}
  • 0
    По той же причине я хотел использовать экземпляр Expression для хранения Expression <Func <int, int >>. Я вижу, что ваше решение будет работать. Не возражаете, если я попрошу вас помочь мне вызвать моего делегата из - Выражение expr: Expression expr = TestMethod (i => i + 1);
  • 0
    @EvgeniyMiroshnichenko Я добавил код, который, я надеюсь, это то, что вы ищете.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню