Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用表达式类调用Lambda表达式?_C#_Delegates_Expression - Fatal编程技术网

C# 如何使用表达式类调用Lambda表达式?

C# 如何使用表达式类调用Lambda表达式?,c#,delegates,expression,C#,Delegates,Expression,我有一个包含Func delegate的表达式。我试图调用它,并得到整数值作为结果 class Program { static Expression TestMethod(Expression<Func<int, int>> expression) { return expression; } static void Main(string[] args) { var expr = TestMet

我有一个包含Func delegate的表达式。我试图调用它,并得到整数值作为结果

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);
    }
}
类程序
{
静态表达式TestMethod(表达式)
{
返回表达式;
}
静态void Main(字符串[]参数)
{
var expr=TestMethod(i=>i+1);
var result=Expression.Lambda(expr.Compile().Invoke(1);
控制台写入线(结果);
}
}
调用表达式时,会出现下一个错误:

未处理的异常:System.ArgumentException:为lambda声明提供的参数数量不正确 位于System.Linq.Expressions.Expression.ValidateLambdaArgs(类型delegateType、表达式和正文、ReadOnlyCollection
1参数、字符串paramName)
at System.Linq.Expressions.Expression.Lambda[TDelegate](表达式体、字符串名称、布尔尾部调用、IEnumerable
1参数) at System.Linq.Expressions.Expression.Lambda[TDelegate](表达式体,布尔尾调用,IEnumerable`1参数) 在System.Linq.Expressions.Expression.Lambda[TDelegate](表达式体,参数Expression[]parameters) 在E:\programming\portfolio\TestConsoleEapp\TestConsoleEapp\Program.cs中的TestConsoleEapp.Program.Main(字符串[]args)处:第22行


如何获得Func委托调用的结果?

您正在将lambda包装到lambda中。。。这不是你想要的。试试这个:

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

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

        Console.WriteLine(result);
    }
}
类程序
{
静态void Main(字符串[]参数)
{
表达式expr=i=>i+1;
var result=expr.Compile().Invoke(1);
控制台写入线(结果);
}
}
如果要使用“passthrough”测试方法,可以执行以下操作:

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);
    }
}
类程序
{
静态表达式TestMethod(表达式)
{
返回表达式;
}
静态void Main(字符串[]参数)
{
var expr=TestMethod(i=>i+1);
var result=((表达式)expr.Compile().Invoke(1);
控制台写入线(结果);
}
}
或者,如果要从非泛型表达式重建lambda:

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);
    }
}
类程序
{
静态LambdaExpression测试方法(表达式)
{
返回表达式;
}
静态void Main(字符串[]参数)
{
var expr=TestMethod(i=>i+1);
var result=Expression.Lambda(expr.Body,expr.Parameters).Compile().Invoke(1);
控制台写入线(结果);
}
}

出于同样的原因,我想使用Expression实例来存储表达式。我相信你的决定会奏效。您不介意我请求您帮助我从-Expression expr:Expression expr=TestMethod(i=>i+1)调用我的委托吗@EvgeniyMiroshnichenko我添加了一些代码,希望这就是您所寻找的。这正是我所寻找的!