gpt4 book ai didi

c# - Roslyn,通过 hostObject 传递值

转载 作者:行者123 更新时间:2023-11-30 12:10:10 26 4
gpt4 key购买 nike

我试图通过 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): error CS0103: The name 'details' does not exist in the current context

最佳答案

错误信息完全正确。当你有一个宿主对象时,你不能通过在你的方法中保存它的局部变量的名称来访问它(那将如何工作?ScriptEngine 将如何学习该名称?)。

相反,您可以直接访问宿主对象,就好像您正在编写该类型的成员方法一样(但不完全是,您不能使用this或访问非公共(public)成员)。

这意味着你应该只写:

session.Execute("destination")

顺便说一句,根据 .Net 命名指南,公共(public)属性的名称应以大写字母开头(例如 Destination)。

关于c# - Roslyn,通过 hostObject 传递值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19272764/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com