gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:58:04 25 4
gpt4 key购买 nike

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

如果推荐 IronPython 以外的脚本语言,我需要它具有:if 语句(最好是 with 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 计算奖金:

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

有没有办法使用 IronPython(或任何其他脚本语言)从代码块中获取相同的表达式树?

最佳答案

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

参见例如https://www.strathweb.com/2018/01/easy-way-to-create-a-c-lambda-expression-from-a-string-with-roslyn/

关于c# - 从 C# 中的脚本语言获取表达式树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53244427/

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