在Roslyn CTP3中执行布尔表达式

拉什·弗里斯比(Rush Frisby)

使用Roslyn CTP3(它具有脚本支持,而最新版本中已删除了脚本支持,这就是为什么我要使用旧的支持)如何使用VB脚本引擎获取布尔表达式的结果?我尝试了以下代码,但是在尝试编译脚本代码时收到语法错误。

using Roslyn.Scripting.VisualBasic;
using System;

class Program
{
    static void Main()
    {
        var engine = new ScriptEngine();
        engine.AddReference(typeof (object).Assembly);
        engine.ImportNamespace("System");

        var session = engine.CreateSession();
        var result = session.Execute<bool>("True");
        Console.WriteLine(result);
    }
}

我使用CSharp ScriptEngine尝试了同样的事情,并且运行良好。我也在VB中尝试了相同的代码(认为在VB中使用VB脚本引擎会产生不同的结果),但是我遇到了相同的错误。

如果您没有旧的CTP3,可以在使用Roslyn CTP3的.NET Fiddle的两个示例中看到这一点。

C#http://dotnetfiddle.net/JBlNmK(有效)VB http://dotnetfiddle.net/CeJAeE(语法错误)

编辑:我可能已经找到了通过将函数包装起来的方法... http://dotnetfiddle.net/PJJzrQ

杰夫·梅卡多(Jeff Mercado)

我认为这是VB实施的限制ScriptEngineIIRC,VB实现不如CTP中的C#实现完整。

C#实现可以将字符串作为独立的语句,代码块或单个表达式执行。但是,VB实现显然不支持单个表达式,但可以运行独立的语句和代码块。您甚至无法使用Execute<T>()大多数泛型类型的泛型重载,您需要手动将其强制转换为适当的类型。

您将不得不更改脚本,以便可以通过正常的VB语句获得所需的值。您在这里没有太多选择,但是函数调用是一条评估为值的语句。也可以使用。

var engine = new ScriptEngine();
var session = engine.CreateSession();
// implement your expression here
session.Execute(@"Function ExecuteExpression As Boolean
    Return True
End Function");
//var result = session.Execute<bool>("ExecuteExpression"); // error
var result = (bool)session.Execute("ExecuteExpression");

您可以创建扩展方法来简化此过程。

public static T ExecuteExpression<T>(this Session session, string expressionCode)
{
    return (T)session.Execute(String.Format(@"Class _SessionExtensions
    Public Shared Function ExecuteExpression As Object
        Return {0}
    End Function
End Class
_SessionExtensions.ExecuteExpression", expressionCode));
}

这将允许您执行以下操作:

var engine = new ScriptEngine();
var session = engine.CreateSession();
var result = session.ExecuteExpression<bool>("True");
var result2 = session.ExecuteExpression<int>("123 + 4523");

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Roslyn中解析nameof表达式

来自分类Dev

在Roslyn中解析嵌入式表达式

来自分类Dev

在Roslyn中获取表达式类型的结果

来自分类Dev

中止roslyn脚本执行

来自分类Dev

Roslyn:如何用表达式替换IdentifierName

来自分类Dev

使用Roslyn创建整数文字表达式

来自分类Dev

使用Roslyn检测Lambda表达式的长度

来自分类Dev

在Roslyn分析器中检查表达式类型的正确方法?

来自分类Dev

如何在Roslyn中限制对外部类型的表达式访问?

来自分类Dev

在Roslyn中解析参数类型

来自分类Dev

Roslyn中的PatternSyntax是什么

来自分类Dev

#if roslyn中的指令代码解析

来自分类Dev

了解C#中运行时代码生成的各种选项(Roslyn,CodeDom,Linq表达式,...?)

来自分类Dev

在Roslyn(Microsoft CodeAnalysis)中,如何创建布尔文字?

来自分类Dev

Lambda语句仅出现Roslyn编译器错误:无法将表达式转换为表达式树

来自分类Dev

如何使用Roslyn获取用户输入表达式的类型?

来自分类Dev

Roslyn中的简单代码完成示例

来自分类Dev

在Roslyn中获取类之间的依赖关系

来自分类Dev

在Roslyn中获取SymbolCallerInfo的通用参数

来自分类Dev

Roslyn-从内存中组装创建MetadataReference

来自分类Dev

试图在roslyn中识别类实例

来自分类Dev

Roslyn:在父代或祖先SyntaxNode中检索Symbol

来自分类Dev

用Roslyn中的node替换琐事

来自分类Dev

roslyn CSharpScript中的DateTime返回“期望”;

来自分类Dev

在Roslyn中获取SymbolCallerInfo的通用参数

来自分类Dev

用Roslyn中的node替换琐事

来自分类Dev

Roslyn 在更改的文档中查找相同节点

来自分类Dev

为什么Roslyn中的Renamer不重命名AnonymousObjectMemberDeclarator?

来自分类Dev

在Roslyn中获取标准元数据名称

Related 相关文章

热门标签

归档