如何在C#表达式中设置参数
我不熟悉c#中的表达式API。假设我有两个双参数x和y的表达式。我想把这个表达式包装成另一个表达式,在这里我可以传递一个双数组而不是两个参数。我尝试了以下方法(我正在用F#测试它,因此是语法)如何在C#表达式中设置参数,c#,.net,linq-expressions,C#,.net,Linq Expressions,我不熟悉c#中的表达式API。假设我有两个双参数x和y的表达式。我想把这个表达式包装成另一个表达式,在这里我可以传递一个双数组而不是两个参数。我尝试了以下方法(我正在用F#测试它,因此是语法) 我认为表达式基本上是一个函数体(这可能是错误的!)。因此,我们不使用Foo(double x,double y),而是使用一个输入表达式(我们称之为Foo_表达式),我知道它有两个参数。我想将这个表达式包装在另一个表达式中(与上面的WrappedFoo等效),这样新的表达式将接受一个双数组参数,然后分发这
我认为表达式基本上是一个函数体(这可能是错误的!)。因此,我们不使用Foo(double x,double y),而是使用一个输入表达式(我们称之为Foo_表达式),我知道它有两个参数。我想将这个表达式包装在另一个表达式中(与上面的WrappedFoo等效),这样新的表达式将接受一个双数组参数,然后分发这些参数以调用Foo_表达式。我不确定我是否可以用表达式来实现这一点。参数
x
和y
在您以前的lambda中编译,并且不会传递到第二个表达式中。lambda
调用,但您似乎并不希望这样,因为这样您就有了一个带有方法签名的表达式,如method(double[],double,double)
。您可能希望将另一个x2
和y2
定义为局部变量,然后将其作为参数传递给第一个编译的lambda
我还不是100%清楚你想要实现什么,如果你澄清一下,我可能会进一步提供帮助。有时,它可以帮助我写出函数的行为,然后将它们转换为表达式。就像在普通C#代码中一样,必须声明表达式中的变量。在中,第一个参数列出了声明的变量。因此,您声明的是result
,而不是x
或y
它在第一个版本中工作,因为x
和y
是参数,而不是局部变量
因此,解决办法是:
let block = Expression.Block( [| x; y; result |], blockStatements )
这是可行的,但主要是偶然的。您不会说result
是应该返回的值,实际返回的值是最后一个表达式的值(expression
s在这方面更像F而不是C)
因此,带有修复的代码将等效于:
double WrappedFoo(double[] inputs)
{
double x;
double y;
double result;
x = inputs[0];
y = inputs[1];
return (result = Foo(x, y));
}
要获得更像您描述的代码,请去掉result
变量,并将最后一条语句更改为您想要返回的表达式:
blockStatements.Add(givenExpr)
我使用F#只是为了测试。我打算用C语言实现。我应该把标题改成.NET而不是C。抱歉。为什么不
double WrappedFoo(double[]args){return Foo(args[0],args[1]);}
?对于像这样简单的事情,你真的不需要变量。这很有效!非常感谢你!我发现这有点违反直觉,因为在上面的常规C#代码中,变量名显然不必与参数名匹配,而表达式版本是按名称将局部变量与givenExpr的参数匹配。无论如何,很高兴它能工作@我不明白你在说什么。在Expression
s中,参数和变量从不按名称匹配,而是按ParameterExpression
对象的引用进行匹配。
double WrappedFoo(double[] inputs)
{
double x;
double y;
double result;
x = inputs[0];
y = inputs[1];
return (result = Foo(x, y));
}
blockStatements.Add(givenExpr)