有没有一种方法可以访问 class 个实例的属性,这些实例是使用 c# 中的 roslyn 编译的内存代码创建的

Is there a way to access properties from class instances created using in memory code compiled by roslyn in c#

我正在尝试创建一个简单的方法来编译一些任意 class,然后让我使用 .Net Core 3.0 和 Roslyn 编译器访问 classes 属性。

我已成功获得要编译的代码并创建了实例,但它显示为所有内容都是静态和私有的。

代码如下:

        private void ExecuteOnCompileCommand()
        {

            var code = @"
                          using System;

                          namespace CompileTest
                          {

                              public class Test
                              {
                                   public int y { get; set; }
                                   public int x { get; set; }

                              }
                           }";

            var system =  MetadataReference.CreateFromFile(typeof(object).Assembly.Location);

            var compilation = CSharpCompilation.Create(
                    "_" + Guid.NewGuid().ToString("D"),
                    syntaxTrees: new SyntaxTree[] { CSharpSyntaxTree.ParseText(code) },
                    references: new [] {system },
                    options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

            using (var ms = new MemoryStream())
            {
                var compilationResult = compilation.Emit(ms);

                if (compilationResult.Success)
                {
                    ms.Seek(0, SeekOrigin.Begin);
                    _assembly = Assembly.Load(ms.ToArray());
                }
            }

            //create instance of class
            var instance = _assembly.CreateInstance(_assembly.DefinedTypes.First().FullName);

    } 

编译并运行后,我在方法的末尾打了一个断点,我可以看到 x 和 y,它说它是 Test 类型,但是我无法设置这些变量,甚至无法设置他们的价值的另一个变量。

不是通常的方式,而是

如果你像这样创建它

dynamic instance = _assembly.CreateInstance(_assembly.DefinedTypes.First().FullName);

你可以这样做:

instance.x = 42;

但请记住,我们在这里放弃了强类型,任何错误都将在 运行 时抛出。

谢谢你,注意安全。