У меня есть выражение, которое содержит 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
ReadOnlyCollection1 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 <,>?
Вы оборачиваете лямбду в лямбду... это не то, что вы хотите. Попробуй это:
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);
}
}