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

时间:2016-05-14 20:44:37

标签: c# linq expression

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

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

从概念上讲,我试图通过组合expression1和amp;来尝试在运行时获得相同的效果。表达式2

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";
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您将如何做到这一点:

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();

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