到目前为止的故事是这样的:
我正在做一个 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=false(我猜是这种情况),是否值得为这种方法的所有潜在问题付出努力,还是我的时间最好花在应用程序中编写自动更新功能并保留它都在主应用程序中(因此用户只需让应用程序每周更新一次)?
- 我的另一个(可能是坏的)想法是将所有 autospec 代码转移到一个单独的 DLL 中,然后在必要时重新部署它,或者甚至可以引用共享网络驱动器上的单个 DLL?
我想无论我走哪条路,这都是一个相当危险的领域。有人能告诉我,如果我打开一 jar 蠕虫,最好妥善保存并真正关闭吗?
有没有更好的方法来处理这整件事?我有一个习惯,就是把我想解决的事情复杂化 :P
正如附加信息一样,autospec 代码不会由用户输入。我每周都会更新它(没有其他人可以访问它),所以希望这至少会减轻一些安全问题。
如果我解释得不好,请道歉。
提前致谢
最佳答案
一些需要考虑的选项:
1) 如果您有一个具有自动构建和部署功能的良好持续集成系统,那么每周部署是否会成为这样的问题?
2) 您是否考虑过 MEF 或类似的东西,它们可以让您仅替换包含新规则的单个 DLL?
3) 如果公式可以简单地表达(不需要评估一些代码,例如 A+B+C+D > E+F+G+H => J 或 K),您可以使用反射来收集参数值,然后应用它们。
4) 您可以在 .NET 4 中使用表达式并从数据库构建表达式树,然后对其求值。
关于c# 将字符串作为代码执行...值得付出努力吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5479270/