c#动态表达式求值器

本文关键字:表达式 动态 | 更新日期: 2023-09-27 18:12:02

我的应用程序需要在WinRT c#应用程序的运行时对字符串表达式求值。

下面是一些例子:

strObj.Substring(10) + strObj.Substring(strObj.Length - 3) 
'001' + strObj.Substring(3) + '003'

注意:以上表达式将在后端定义,应用程序应在运行时根据用户输入进行计算。

我看了DynamicExpresso、NReco和其他一些表达式求值器,它们在WinRT环境中都不工作。在WinRT中有可用的框架吗?或者如何在代码中实现它?

c#动态表达式求值器

WinRT环境在编译为可移植类库(PCL)之前不能引用通常的类库。可移植库对框架类/方法的使用有很多限制(只允许使用常规。net类的子集);在大多数情况下,如果不额外采用这些限制,类库就不能编译为PCL。

我已经研究了编译NReco lambdparser作为PCL的可能性,并获得了积极的结果。PCL采用的版本不包括灵活的NReco类型转换器(它们基于PCL不可用的ITypeConverter/TypeDescriptor),只使用Convert。ChangeType。

下载链接:NReco LambdaParser Portable(附源代码)

下面的代码可以很好地使用PCL版本的lambdparser:

var lambdaParser = new LambdaParser();
Func<string,int,string> left = (s,n) => { return s.Substring(n); };
var vars = new Dictionary<string,object>() {
    {"str1", "123456"},
    {"str2", "123"},
    {"Left", left} // custom function
};
var res = lambdaParser.Eval(
    "str1.Substring(3)+'" '"+str2.Substring(str2.Length-2)+'" '"+Left(str1,1)", vars );
Console.WriteLine("Res: {0}", res);

如果你发现这个pcl版本是可用的,我可能会在GitHub上发布它的源代码并创建Nuget包。

你也可以试试DynLan -它也支持PCL/net3.5/net。核心(https://github.com/b-y-t-e/DynLan)。库本身解析代码并逐行执行。下面是一个小例子,你的表达式(result == "klmnoprstuwxyzxyz"):

            var dict = new Dictionary<string, object>();
            dict["strObj"] = "abcdefghijklmnoprstuwxyz";
            object result = new Compiler().
                Compile(@" strObj.Substring(10) + strObj.Substring(strObj.Length - 3) ").
                Eval(dict);

你也可以在你的脚本中使用变量,像这样(result == "ABCDEPRSTU"):

            var dict = new Dictionary<string, object>();
            dict["strObj"] = "abcdefghijklmnoprstuwxyz";
            object result = new Compiler().
                Compile(
                    @" a = strObj.Substring(0, 5).ToUpper(); " +
                    @" b = strObj.Substring(15, 5).ToUpper(); " +
                    @" a + b ").
                Eval(dict);