Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.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_Expression - Fatal编程技术网

C# 在运行时链接表达式树中的方法调用

C# 在运行时链接表达式树中的方法调用,c#,linq,expression,C#,Linq,Expression,我希望在运行时动态构建表达式树。该表达式将调用多个方法,并将一个方法的结果传递给下一个方法,最后一个方法返回一些内容。我可以毫不费力地构建和运行单个方法调用表达式,但我不知道如何将这些方法链接到一个表达式中 下面是简化的代码。实时代码中的方法具有数量可变的方法调用和参数 从概念上讲,我试图在运行时通过组合expression1和expression2来获得与此等价的结果 var uncompileable = HostNumber.GetHostNumber("Bleacher").HostSt

我希望在运行时动态构建表达式树。该表达式将调用多个方法,并将一个方法的结果传递给下一个方法,最后一个方法返回一些内容。我可以毫不费力地构建和运行单个方法调用表达式,但我不知道如何将这些方法链接到一个表达式中

下面是简化的代码。实时代码中的方法具有数量可变的方法调用和参数

从概念上讲,我试图在运行时通过组合expression1和expression2来获得与此等价的结果

var uncompileable = HostNumber.GetHostNumber("Bleacher").HostStatus.GetHostStatus(); // Status = "Online"


以下是您将如何做到这一点:

var expression =
    Expression.Call(
        typeof (HostStatus).GetMethod("GetHostStatus", BindingFlags.Public | BindingFlags.Static),
        Expression.Call(
            typeof (HostNumber).GetMethod("GetHostNumber", BindingFlags.Public | BindingFlags.Static),
            Expression.Constant("Bleacher", typeof (string))));

var func = Expression.Lambda<Func<string>>(expression).Compile();

var result = func();
var表达式=
表情,打电话(
typeof(HostStatus).GetMethod(“GetHostStatus”,BindingFlags.Public | BindingFlags.Static),
表情,打电话(
typeof(HostNumber).GetMethod(“GetHostNumber”,BindingFlags.Public | BindingFlags.Static),
常量(“漂白剂”,类型(字符串));
var func=Expression.Lambda(Expression.Compile();
var result=func();

顺便说一下,我不清楚你为什么要这样做。为什么要构建一个静态表达式然后编译它?

HostNumber.GetHostNumber(“漂白者”).HostStatus.GetHostStatus()
不会编译,因为
GetHostNumber
返回一个整数,而不是某个具有
HostStatus
属性的对象。我知道。我只是添加了这一行,以显示我正在努力实现的概念。然后,HostNumber.GetHostNumber(“漂白剂”)(45)的输出应传递给HostStatus.GetHostStatus()。谢谢,谢谢。这些方法调用是从配置文件(DSL)解析的。我懂了。所以它是动态的,因为方法名不是静态的。是的,但表达式可能包含一个方法调用或最多三个,而方法调用可能没有参数或最多两个。因此,您的代码可能会变得复杂。我曾尝试使用expression visitor将表达式合并在一起,但在过程中迷失了方向。请查看,它可能会帮助您完成所要做的工作。它允许您在另一个表达式中使用一个表达式,然后展开结果以创建真正的组合表达式。但我不确定这是否适用于你的情况。
var expression =
    Expression.Call(
        typeof (HostStatus).GetMethod("GetHostStatus", BindingFlags.Public | BindingFlags.Static),
        Expression.Call(
            typeof (HostNumber).GetMethod("GetHostNumber", BindingFlags.Public | BindingFlags.Static),
            Expression.Constant("Bleacher", typeof (string))));

var func = Expression.Lambda<Func<string>>(expression).Compile();

var result = func();