微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Roslyn / CSharpScript - 声明和初始化动态变量以在脚本中使用它们

如何解决Roslyn / CSharpScript - 声明和初始化动态变量以在脚本中使用它们

我需要动态执行 C# 语句,其中声明了许多运行时变量。最终用户假设在运行时声明变量(某些类型仅如 int,string,List<string>,List<int>,bool etc. )并对它们执行操作或计算/执行单行表达式。

为此,我可以看到 Flee 库用于评估表达式并提供了一种动态处理 AddInitialize 变量的机制。

例如可以动态声明变量并使用当前 invuse 变量的值初始化它们,例如:

int var1 = 2;
int var2 = 25;
List<string> _lstStr = new List<string>();
_lstStr.Add("ABC");
_lstStr.Add("DEF");

ExpressionContext context1 = new ExpressionContext();
context1.Variables.Add("var1",var1);
context1.Variables.Add("var2",var2);
context1.Variables.Add("_lstStr",_lstStr ); 

// 注意变量名动态添加到脚本上下文中,并使用在当前作用域中声明的变量进行初始化,并且可以评估如下表达式:

var expression = new Expressions.DynamicExpression(" a > b ",ExpressionLanguage.Csharp);

var expression = new Expressions.DynamicExpression("lstStr[0]=="abc"",ExpressionLanguage.Csharp);

但是,这仅限于将表达式计算为真/假,并仅获取语句的值。这不允许我执行 "c = a + b" or "lstStr.Add("PQR") 之类的表达式来修改对象的值并调用其成员方法

我可以看到 Roslyn / SharpScript 可以执行所需的语句,但是,我并没有像 Flee 提供的那样在上下文中动态声明变量并使用当前使用的对象初始化它们。

其实我找到了答案,而且很简单。我所需要的只是脚本引擎。为了获取变量,我执行了以下代码段中最后一行的操作:

var script = csharpscript.Create("");
script = script.ContinueWith("int a = 10;"); 
script = script.ContinueWith("int b = 20;");

script = script.ContinueWith("List<string> _myList = "); // how to assign current List<string> object here ?

var vars = script.RunAsync().Result.Variables;

在上面的 Roslyn / csharpscript 中,如何在脚本上下文中动态声明变量并使用当前使用的对象进行初始化?因为我需要分配已经拥有大量元素的长列表/集合,因此为它们生成动态代码将具有挑战性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。