【问题标题】:Dynamically execute string as code in C#在 C# 中将字符串作为代码动态执行
【发布时间】:2017-03-24 06:03:39
【问题描述】:

我需要将字符串转换为可执行代码。 stringforeach 语句中。

foreach (InsuredItem _i in p.InsuredItems)
{
    string formula = "(_i.PremiumRate/100)*SumAssured";
    _i.Premium = (Execute formula);
}

公式是从设置中加载的。这只是一个演示。我需要在 foreach 循环中执行字符串。 谢谢。

【问题讨论】:

  • 您只想要公式或结果?
  • 我需要结果。这将是十进制值
  • 下面是我尝试过但仍然无法正常工作的代码:Expression ev = new Expression(formula); ev.Parameters["_i"] = _i; _i.Premium = ev.Evaluate().ToDecimal();

标签: c# reflection codedom


【解决方案1】:

假设您的公式是有效的 C# 代码并且它使用一组已知的局部变量(以便您可以创建一个包含所有这些变量的“全局”类型),您应该能够使用 Roslyn scripting API 来执行此操作:

public class Globals
{
    public InsuredItem _i;
    public decimal SumAssured;
}

…

string formula = "(_i.PremiumRate/100)*SumAssured";
var script = CSharpScript.Create<decimal>(formula, globalsType: typeof(Globals))
    .CreateDelegate();

foreach (InsuredItem _i in p.InsuredItems)
{
    _i.Premium = await script(new Globals { _i = _i, SumAssured = SumAssured });
}

【讨论】:

  • 顺便说一句,局部变量名称以下划线开头在 C# 中是不常见的,您可能需要考虑使用通用命名约定。
  • 在 var script = CSharpScript.Create(formula, globalsType: typeof(Globals)) .CreateDelegate();
  • @SebastianKilonzo 那么,什么是 VVC?它必须是特定于您的代码的东西。是公式里的东西吗?
  • 谢谢 svic... 你是对的,这与我的变量有关。它现在工作
猜你喜欢
  • 1970-01-01
  • 2017-11-07
  • 2016-07-12
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多