C# 用c语言从脚本语言中获取表达式树#

C# 用c语言从脚本语言中获取表达式树#,c#,ironpython,expression-trees,C#,Ironpython,Expression Trees,我正在寻找一种从C#中的脚本生成表达式树的方法。目前,我使用的是IronPython,但如果它能够更容易地获取表达式树,我愿意进行切换。而且,我意识到我可以通过实现自己的脚本语言来实现这一点;然而,如果可能的话,我宁愿使用已经创建的 如果建议使用IronPython以外的脚本语言,我需要它具备:If语句(最好带有and/or)、数学运算(+、-、*、/、log、%、^)、循环和添加自定义函数的能力 作为我尝试做的一个示例,我包含了两段代码。其中一段使用创建并编译的表达式树计算奖金: using

我正在寻找一种从C#中的脚本生成表达式树的方法。目前,我使用的是IronPython,但如果它能够更容易地获取表达式树,我愿意进行切换。而且,我意识到我可以通过实现自己的脚本语言来实现这一点;然而,如果可能的话,我宁愿使用已经创建的

如果建议使用IronPython以外的脚本语言,我需要它具备:If语句(最好带有and/or)、数学运算(+、-、*、/、log、%、^)、循环和添加自定义函数的能力

作为我尝试做的一个示例,我包含了两段代码。其中一段使用创建并编译的表达式树计算奖金:

using System;
using System.Linq.Expressions;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Employee employee = new Employee() { Salary = 100000, BonusPct = .05 };
            Expression<Func<Employee, double>> calcbonusExp = x => x.Salary * x.BonusPct; ;
            var calcBonus = calcbonusExp.Compile();
            Console.WriteLine(calcBonus(employee));
            Console.WriteLine(calcbonusExp.NodeType);
            Console.WriteLine(calcbonusExp.Body);
            Console.WriteLine(calcbonusExp.Body.NodeType);
            foreach (var param in calcbonusExp.Parameters)
            {
                Console.WriteLine(param.Name);
            }
            Console.Read();
        }
}

public class Employee
    {
        public double Salary { get; set; }
        public double BonusPct { get; set; }
    }
}

是否有任何方法可以使用IronPython(或任何其他脚本语言)从代码块中获得相同的表达式树?

您可以使用Roslyn从用C或VB编写的脚本中创建表达式对象


例如,请参见

第二个示例本身并没有真正创建表达式树。它创建一个委托。这里的常见元素是创建一个委托并调用它。这就是你真正想要的吗?因为有一种方法可以有效地做到这一点。表达式树更多的是将代码表示为可以检查和分析的数据,但第二个示例并不是这样做的。
using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Employee employee = new Employee() { Salary = 100000, BonusPct = .05 };

            ScriptEngine engine = Python.CreateEngine();
            ScriptScope scope = engine.CreateScope();

            ScriptSource source = engine.Execute(
                @"def calcBonus(employee):
                      return employee.Salary * employee.BonusPct 
                ", scope);
            var calcAdd = scope.GetVariable("calcBonus");
            var result = calcAdd(employee);
            Console.WriteLine(result);
            Console.Read();
        }
    }

    public class Employee
    {
        public double Salary { get; set; }
        public double BonusPct { get; set; }
    }
}