Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.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# 如何创建没有参数的调用表达式_C#_Linq_Lambda - Fatal编程技术网

C# 如何创建没有参数的调用表达式

C# 如何创建没有参数的调用表达式,c#,linq,lambda,C#,Linq,Lambda,有一只羔羊 例如:(x,y)=>F(x*2)+y 我需要用常量(如5)替换x,得到表达式y=>F(10)+y 为此,我想调用表达式{5*2},并将返回的结果作为 F()方法参数。 我这样做是为了找到具有相同参数的方法调用您需要使用以下命令将参数替换为值: 公共类参数replacervisitor:ExpressionVisitor { 私有字符串参数名; 私人表达参数置换; 公共静态参数replacervisitor Create(字符串名称,T值) { 返回新参数replacervisitor

有一只羔羊

例如:
(x,y)=>F(x*2)+y
我需要用常量(如5)替换x,得到表达式
y=>F(10)+y
为此,我想调用表达式
{5*2}
,并将返回的结果作为
F()
方法参数。
我这样做是为了找到具有相同参数的方法调用

您需要使用以下命令将参数替换为值:

公共类参数replacervisitor:ExpressionVisitor
{
私有字符串参数名;
私人表达参数置换;
公共静态参数replacervisitor Create(字符串名称,T值)
{
返回新参数replacervisitor(名称、表达式、常量(值));
}
公共参数replacervisitor(字符串名称、表达式替换)
{
this.parameterName=名称;
此参数替换=替换;
}
受保护的重写表达式VisitLambda(表达式节点)
{
//创建不带替换参数的新lambda表达式
返回表达式.Lambda(Visit(node.Body),node.Parameters.Where(x=>x.Name!=parameterName.ToArray());
}
受保护的重写表达式VisitParameter(ParameterExpression节点)
{
//如果我们按名称找到参数,则将其用法替换为常量表达式
返回节点.Name==parameterName?ParameterReplace:节点;
}
}
如果输入表达式为:

Expression<Func<int, int, int>> func = (x,y) => F(x*2) + y;
表达式func=(x,y)=>F(x*2)+y;
您可以通过以下方式应用替换程序:

var newFunc = (Expression<Func<int, int>>)ParameterReplacerVisitor.Create("x", 5).Visit(func);
var newFunc=(表达式)参数replacervisitor.Create(“x”,5).Visit(func);
这将产生相当于:

Expression<Func<int, int>> newFunc = y => F(5*2) + y;
表达式newFunc=y=>F(5*2)+y;

实际上,您可以用任何其他表达式替换任何参数,其类型与用
表达式替换参数的类型相同。常量
只是一种特殊情况。

谢谢,@ckuri另一个问题:假设我可以得到一个表达式。()=>F(5*2)+F(20/2)。对于每个方法,我将有一个参数表达式{5*2}和{20/2}。如何检查参数的等价性?我必须编译它们吗?那更复杂。您可以编写另一个ExpressionVisitor,该ExpressionVisitor需要编译每个无参数子表达式(或者如果您想将其限制为函数调用,只需考虑/覆盖VisitMember)并比较它们的返回值。但是,对于复杂/多个表达式,这可能会导致性能下降。
Expression<Func<int, int>> newFunc = y => F(5*2) + y;