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 )。