WinRT C#动态表达式求值程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WinRT C#动态表达式求值程序相关的知识,希望对你有一定的参考价值。

我的应用程序中要求在WinRT c#应用程序中运行时评估字符串表达式。

以下是一些示例表达式:

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

注意:上面的表达式将在后端定义,应用程序应在运行时使用用户输入进行评估。

我查看了DynamicExpresso,NReco和其他一些表达式评估程序,这些都不适用于WinRT环境。 WinRT中是否有可用的框架?或者我如何在代码中实现它?

答案

WinRT环境不能引用通常的类库,直到它编译为可移植类库(PCL)。可移植库对框架类/方法的使用有很多限制(只允许通常的.NET类的子集);在大多数情况下,如果不对这些限制进行额外采用,则无法将类库编译为PCL。

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

下载链接:NReco LambdaParser Portable (with source code)

以下代码适用于LambdaParser的PCL版本:

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.core(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);

以上是关于WinRT C#动态表达式求值程序的主要内容,如果未能解决你的问题,请参考以下文章

IntelliJ:求值lambda表达式在调试时引发编译错误

求C++ 表达式求值得程序,最好简单说明数据结构和大致方法

C语言 任意表达式求值。(栈的应用

《C程序设计语言》笔记 参考手册3

C语言表达式求值

判断C语言算术表达式的合法性