尝试弄清楚如何利用CSharpCodeProvider在运行时编译字符串数据。
在xml中,我将相当于谓词条件的内容存储在字符串中。
我希望能够在当前上下文中执行并获得这些语句的结果。
例如,当读取和执行<Condition>Value=="ABCD1234"</Condition>时,它应该在当前对象作用域中查找值,并根据语句的计算结果返回true或false。
我认为我使用CSharpCodeProvider的方向是正确的,但是我能找到的所有例子都与编译成.DLL或.EXE有关,我真的只想在内存中编译,这样我就可以执行比较,并将true或false返回到应用程序的另一部分。
对于如何最好地实现这一点有什么想法吗?CSharpCodeProvider是做这项工作的最佳工具吗?
发布于 2010-10-20 00:29:46
我强烈建议对这样的事情使用FLEE。它不知道原生C#,但它有能力解析和执行合理的函数子集,这些函数看起来适合您的使用。
我已经在很多场合使用过FLEE,我发现它很容易使用,而且足够快。
发布于 2010-10-20 00:25:18
我个人更愿意创建一种小型的DSL (领域特定语言),而不是编译这样的字符串。问题是,将它们混合到一些编译的源代码中会打开注入攻击的大门,而且检查语法也很困难。为简单的表达式和谓词创建一个小型解析器实际上非常简单,所以如果您不依赖于LINQ或其他任何适合您的条件的解析器,那么您可能会更好地使用DSL路线。
为了对我所说的内容有一个印象,我邀请您来看看我的金色解析器引擎,它是为以下工作而设计的:http://code.google.com/p/bsn-goldparser/
解析过程的输出是语义AST (抽象语法树),然后可以编写它来动态执行“解释”计算或创建MSIL代码,这样您就可以完全控制正在发生的事情,从而获得快速编译(JITed)代码的好处。
发布于 2010-10-20 00:28:36
CSharpCodeProvider可能是过度杀伤力。如果您的条件是基本的逻辑运算符(例如,等于、大于/小于),那么构建几个委托并编写一个简单的解析器来执行条件可能会更好。您的解析器将确定使用哪个运算符,并执行适当的委托:
delegate bool equalsDel(string s1, string s2)
equalsDel = (s1, s2) => {return sq == s2;}
//Get your strings from the file and invoke the delegate
return equalsDel(s1, s2);查看Visitor模式,了解如何编写解析器/访问器来确定运算符并执行适当的委托。您可以使用Func<T>发挥创造力,创建一个高效的系统,而不需要太多的代码。
https://stackoverflow.com/questions/3970382
复制相似问题