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#动态表达式求值程序的主要内容,如果未能解决你的问题,请参考以下文章