c#将字符串作为代码执行……值得付出努力吗?

c#将字符串作为代码执行……值得付出努力吗?,c#,string,execution,C#,String,Execution,以下是迄今为止的故事: 我正在做一个C#winforms应用程序,以便于为租用报价指定设备 在它里面,我有一个约1500个库存项目的列表 这些项目有一个名为AutospecQty的属性,该属性有一个get访问器,需要执行特定于每个项目的一些代码。此代码将引用列表中的其他各项 因此,例如,一个项目(我们称之为Item0001)有一个get访问器,它可能需要执行一些类似以下内容的代码: [some code to get the following items from the list here]

以下是迄今为止的故事:

我正在做一个C#winforms应用程序,以便于为租用报价指定设备

在它里面,我有一个约1500个库存项目的
列表

这些项目有一个名为
AutospecQty
的属性,该属性有一个
get
访问器,需要执行特定于每个项目的一些代码。此代码将引用列表中的其他各项

因此,例如,一个项目(我们称之为
Item0001
)有一个
get
访问器,它可能需要执行一些类似以下内容的代码:

[some code to get the following items from the list here]

if(Item0002.Value + Item0003.Value > Item0004.Value)
{ return Item0002.Value }
else
{ return Item0004.Value }
这一切都很好,但这些代码可能每周都会更改,所以我尽量避免经常重新部署。而且,每个项目可能(将)有完全不同的代码。一些人将查询列表,一些人将做一些冗长的数学函数,一些人将像上面一样简单的加法…一些人将依赖于列表中不包含的变量

我想做的是将每个项目的代码存储在数据库中的一个表中,然后当应用程序启动时,只需拉出相关代码并将其放入一个列表中,以便在时机成熟时执行

我在internot上看到的大多数关于执行字符串的例子似乎都很冗长、复杂,而且/或者对新手程序员不太友好(我完全是个业余爱好者),而且似乎没有考虑传递变量

因此,问题是:

  • 有没有一种更简单的方法来实现我的目标
  • 如果1=false(我猜是这样),那么这种方法的所有潜在问题都值得付出努力,还是我的时间最好花在将自动更新功能写入应用程序中,并将其全部保存在主应用程序中(因此用户只需让应用程序每周更新一次)
  • 我的另一个想法(可能不好)是将所有autospec代码转移到一个单独的DLL中,或者在必要时重新部署,或者甚至可以引用共享网络驱动器上的单个DLL
  • 我想无论我走哪条路,这都是相当危险的地方。有人能告诉我,如果我打开一罐虫子,最好把它好好地关上吗

    有没有更好的方法来处理这整件事?我有一个习惯,就是把我想要克服的事情过度复杂化:P

    与其他信息一样,autospec代码也不会由用户输入。我每周都会更新它(没有其他人可以访问),所以希望这至少能缓解一些安全问题

    如果我解释得不好,我道歉


    “提前感谢”

    看来您可以通过实施

    正如维基百科所描述的:

    通过使用布尔逻辑将业务逻辑链接在一起,可以重新组合业务逻辑


    如果您考虑过像MEF这样的东西,那么您可以使用许多小型DLL来实现各种版本的计算,并简单地参考从数据库加载哪个版本


    这是假设您可以将它们全部封装在一个(或少量)接口中。

    我将通过创建一种特定于域的语言来解决这个问题,程序可以对该语言进行解释以执行规则。然后将DSL代码的片段放入数据库中


    正如你所看到的,我也喜欢把事情过分复杂化。:-)但只要简化长期使用,它就可以工作。

    需要考虑的一些选项:

    1) 如果您有一个具有自动构建和部署功能的良好的持续集成系统,那么每周部署会是这样一个问题吗

    2) 您是否考虑过MEF或类似工具,它允许您仅替换包含新规则的单个DLL

    3) 如果公式可以简单地表示(无需计算某些代码,例如A+B+C+D>e+F+g+H=>J或K),则可以使用反射来收集参数值,然后应用它们


    4) 您可以使用.NET 4中的表达式,从数据库中构建表达式树,然后对其进行计算。

    您可以让程序在运行时使用
    CSharpCodeProvider
    将规则编译成一个类,该类的作用类似于插件


    请参阅以获取如何执行此操作的示例。

    您是否考虑过使用诸如IronPython之类的脚本语言进行计算?我还不知道有任何方法可以创建一个不太复杂的DSL。@Kragen-编写一个可以使用Recrive解析器计算“a=5;B=10;C=3;X=a*(B+C)”的程序是一个Sophore项目。通过创建自定义表达式树(包括条件“if…else…”逻辑)来提高性能是一个额外的要求。用内置表达式替换变量(“上一个项目成本”)很简单。我真的觉得没那么难。DSL与构建通用语言不同。它通常甚至不会是图灵完成的,我已经为不同的项目做了一些这样的工作,几乎没有什么困难。我编写的一种语言只用于为我开发的另一个子系统生成测试。另一个是向大型机平面文件格式文件解释器添加消歧信息。这些都是有趣的项目,使得花费在另一个无意识中间件组件上的所有时间都是值得的。请注意,运行时编译代码会占用程序集使用的内存,因为您无法卸载正在运行的程序集。我在ASP.NET中使用此技术关闭了出现内存不足异常的IIS服务器。@neontapir-您可以将编译后的代码加载到单独的appdomain中。确实,单独的应用程序域可以避免此问题。在我们的例子中,我们最终编写了一个IronRuby脚本引擎解决方案。在对此进行了更多的研究之后,一周只开始一次,如果一切按计划进行,几个月后事情会变慢(哈哈!耶,对了…),所以我想我会给自己做一个很好的更新