如何在主C#代码和运行时编译代码中创建和使用相同的类?

时间:2019-02-26 12:53:17

标签: c# .net

我的C#应用​​使用CSharpCodeProvider.CompileAssemblyFromSource在C#上编译小型脚本。

我需要一种在脚本中设置许多主代码字段的方法。

我需要在两个地方都能看到的东西。

我在脚本和主要代码中声明了测试类,如下所示:

namespace MainNS
{
    public class TestClass
    {
        public string asd;
        public int dsa;
    }
}

我的脚本如下:

using System;
using System.Reflection;
using System.Collections.Generic;

namespace ScriptedNS
{
    public class TestClass
    {
        public string asd;
        public int dsa;
    }

    public class ScriptTaskInfo
    {
        private TestClass GlobalTC;     

        public void Initialize(object global_tc)
        {
            this.GlobalTC = (TestClass)global_tc; //of course invalid cast here
            this.GlobalTC.asd = "string set from script that should be visible in main code";
        }

        public void Execute()
        {
            //do something with this.GlobalTC
        }
    }
}

当我在主代码中创建TestClass实例并尝试用其Initialize脚本对象时,我得到了无效的强制转换异常。

如何实现相同的对象对于脚本和主代码都是可见的,我可以将其设置为正常的字段,而不仅仅是具有Dictionary<string, object>映射并始终从对象转换为不同类型。

1 个答案:

答案 0 :(得分:0)

您可以使用(dynamic global_tc)代替(object global_tc)

public class ScriptTaskInfo
    {
        private TestClass GlobalTC;     

        public void Initialize(dynamic global_tc)
        {
            this.GlobalTC = global_tc; 
            this.GlobalTC.asd = "string set from script that should be visible in main code";
        }

        public void Execute()
        {
            //do something with this.GlobalTC
        }
    }