c# - 如何将对象传递给脚本?

标签 c# roslyn

在下面的代码片段中,我如何将我的对象作为参数传递给脚本中的方法?

var c = new MyAssembly.MyClass()
{
    Description = "test"
};

var code = "using MyAssembly;" +
           "public class TestClass {" +
           "  public bool HelloWorld(MyClass c) {" +
           "    return c == null;" +
           "  }" +
           "}";

var script = CSharpScript.Create(code, options, typeof(MyAssembly.MyClass));
var call = await script.ContinueWith<int>("new TestClass().HelloWorld()", options).RunAsync(c);

最佳答案

Globals 类型应该将任何全局变量声明作为其属性。

假设您获得了正确的脚本引用:

var metadata = MetadataReference.CreateFromFile(typeof(MyClass).Assembly.Location);

选项 1

您需要定义一个 MyClass 类型的全局变量:

public class Globals
{
    public MyClass C { get; set; }
}

并将其用作 Globals 类型:

var script = 
    await CSharpScript.Create(
        code: code,
        options: ScriptOptions.Default.WithReferences(metadata),
        globalsType: typeof(Globals))
    .ContinueWith("new TestClass().HelloWorld(C)")
    .RunAsync(new Globals { C = c });

var output = script.ReturnValue;

请注意,在 ContinueWith 表达式中,它是一个 C 变量,也是 Globals 中的一个 C 属性.这应该可以解决问题。


选项 2

在您的情况下,如果您打算多次调用脚本,则创建委托(delegate)可能是有意义的:

var f =
    CSharpScript.Create(
        code: code,
        options: ScriptOptions.Default.WithReferences(metadata),
        globalsType: typeof(Globals))
    .ContinueWith("new TestClass().HelloWorld(C)")
    .CreateDelegate();

var output = await f(new Globals { C = c });

选项 3

在您的情况下,您甚至不需要传递任何 Globals

var f =
    await CSharpScript.Create(
        code: code,
        options: ScriptOptions.Default.WithReferences(metadata))
    .ContinueWith<Func<MyClass, bool>>("new TestClass().HelloWorld")
    .CreateDelegate()
    .Invoke();

var output = f(c);

关于c# - 如何将对象传递给脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38278701/

相关文章:

c# - 插入后如何取回标识值

c# - MySQL 参数化选择查询连接表问题

c# - 使用 ExpressionTree 将委托(delegate) (Action<TObject, TValue>) 检索到索引器的 Setter

c# - 如何用 SimpleLambdaExpression 中的另一个变量替换 lambda 参数的用法?

c# - Roslyn 准备好使用 C# 10 了吗?

roslyn - 如何使用 Roslyn 创建泛型类型引用?

c# - 用C#从串口读取所有缓冲区数据

c# - linq to sql "into"条件选择

c# - Roslyn 将内容嵌入程序集

c# - Roslyn 编译不解析 mscorlib 引用