c#执行一个字符串作为代码......值得努力吗?

时间:2011-03-29 21:39:30

标签: c# string execution

到目前为止,这是故事:

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

其中,我有List<T> ~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. 是否有更容易/更简单的方法来实现我想要做的事情?
  2. 如果1 =假(我猜是这样的话),这种方法的所有潜在问题是否值得努力,或者我的时间会更好地花在将自动更新功能写入应用程序并保持它所有内部主应用程序(因此用户只需让应用程序每周更新一次)?
  3. 我的另一个(可能是坏的)想法是将所有autospec代码转移到一个单独的DLL,并在必要时重新部署,或者甚至可以引用共享网络驱动器上的单个DLL?
  4. 我想这是一个非常危险的领域,无论我走哪条路。有人可以告诉我,如果我打开一罐最好的蠕虫并真正关闭吗?

    有没有更好的办法解决这一切?我有一个过度复杂的习惯,我正试图踢:P

    正如附加信息一样,autospec代码不会是用户输入的。这将是我每周更新它(没有其他人可以访问它),所以希望至少可以缓解一些安全问题。

    如果我解释得很糟糕,请道歉。

    提前致谢

5 个答案:

答案 0 :(得分:1)

看起来您可以通过实施specification pattern来获得良好的服务。

正如维基百科所描述的那样:

  

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

答案 1 :(得分:1)

您是否考虑过类似MEF的内容,那么您可以使用许多小型dll来实现各种版本的计算,并简单地引用从数据库中加载哪一个。

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

答案 2 :(得分:1)

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

正如你所看到的,我也喜欢过于复杂的事情。 :-)但只要简化了长期使用,它就能发挥作用。

答案 3 :(得分:1)

要考虑的一些选项:

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

2)您是否考虑过MEF或类似内容,只允许您替换包含新规则的单个DLL?

3)如果公式可以简单表达(无需评估某些代码,例如A + B + C + D&gt; E + F + G + H =&gt; J或K)您可以使用反射收集参数值然后应用它们。

4)您可以在.NET 4中使用Expressions并从数据库构建表达式树,然后对其进行评估。

答案 4 :(得分:0)

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

有关如何执行此操作的示例,请参阅Compiling code during runtime