gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:23:21 25 4
gpt4 key购买 nike

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

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

从概念上讲,我试图通过组合 expression1 和 expression2 在运行时获得与此等效的内容

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

using System;
using System.Linq.Expressions;

namespace SO
{
internal class Program
{
private static void Main(string[] args)
{
ConstantExpression param1 = Expression.Constant(Convert.ChangeType("Bleacher", typeof(String)));
MethodCallExpression expression1 = Expression.Call(typeof(HostNumber), "GetHostNumber", null, new Expression[] { param1 });

ConstantExpression param2 = Expression.Constant(Convert.ChangeType("45", typeof(int)));
MethodCallExpression expression2 = Expression.Call(typeof(HostStatus), "GetHostStatus", null, new Expression[] { param2 });

var invokee = Expression.Lambda(expression1).Compile();
var result = invokee.DynamicInvoke();

}
}

public class HostNumber
{
public static int GetHostNumber(string hostName)
{
return 45;
}
}

public static class HostStatus
{
public static string GetHostStatus(int hostNumber)
{
return "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();

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

关于c# - 运行时在表达式树中链接方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37231656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com