Roslyn,通过hostObject传递值
我试图通过hostObject发送一个类,但显然它不想工作:
using Roslyn.Compilers; using Roslyn.Compilers.CSharp; using Roslyn.Scripting; using Roslyn.Scripting.CSharp; public class ShippingService { public class ShippingDetails//class that I want to send { public decimal total { get; set; } public int quantity { get; set; } public string destination { get; set; } } public static string ShipingCost(decimal total, int quantity, string destination) { var details = new ShippingDetails { total = total, quantity = quantity, destination = destination }; try { ScriptEngine roslynEngine = new ScriptEngine(); Roslyn.Scripting.Session session = roslynEngine.CreateSession(details); session.AddReference(details.GetType().Assembly); session.AddReference("System.Web"); session.ImportNamespace("System"); session.ImportNamespace("System.Web"); var result = session.Execute("details.destination"); return result; } catch (Exception e) { return e.Message; } return ""; } }
当我调用函数目的地时,例如“法国”,我应该在结果中得到这个值,但我错了:
Roslyn.Compilers.CompilationErrorException:(1,1):错误CS0103:当前上下文中不存在名称’details’
错误消息完全正确。 当你有一个宿主对象时,你不能通过在你的方法中保存它的局部变量的名称来访问它(这怎么会工作? ScriptEngine
将如何学习这个名字?)。
相反,您可以直接访问宿主对象,就像您正在编写该类型的成员方法一样(但不完全是,您不能使用this
或访问非公共成员)。
这意味着你应该只写:
session.Execute("destination")
BTW,根据.Net命名指南,公共属性的名称应以大写字母开头(例如Destination
)。