我希望在运行时动态构建表达式树。该表达式将调用多个方法,并将一个方法的结果传递给下一个方法,最后一个方法返回某些内容。我可以轻松地构建和运行单个方法调用表达式,但无法弄清如何在 Expression 中链接这些方法。
以下是简化后的代码。实际代码具有可变数量的方法调用和参数。
从概念上讲,我正在尝试通过组合 expression1 和 expression2 在运行时获得等效的结果。
以下是简化后的代码。实际代码具有可变数量的方法调用和参数。
从概念上讲,我正在尝试通过组合 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";
}
}
}
HostNumber.GetHostNumber("Bleacher").HostStatus.GetHostStatus()
无法编译,因为GetHostNumber
返回一个整数,而不是具有HostStatus
属性的对象。 - Yacoub Massad