C# 有没有办法从使用roslyn在c中编译的内存中代码创建的类实例中访问属性#

C# 有没有办法从使用roslyn在c中编译的内存中代码创建的类实例中访问属性#,c#,.net-core,compilation,roslyn,C#,.net Core,Compilation,Roslyn,我正在尝试创建一个简单的方法来编译一些任意类,然后使用.NETCore3.0和Roslyn编译器访问这些类的属性 我已经成功地编译了代码并创建了实例,但是它看起来是静态和私有的 代码如下: private void ExecuteOnCompileCommand() { var code = @" using System; name

我正在尝试创建一个简单的方法来编译一些任意类,然后使用.NETCore3.0和Roslyn编译器访问这些类的属性

我已经成功地编译了代码并创建了实例,但是它看起来是静态和私有的

代码如下:

        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,它说这是类型测试,但是我不能设置这些变量,甚至不能将另一个变量设置为它们的值。

不是以通常的方式,而是

如果你像这样创造它

dynamic instance = _assembly.CreateInstance(_assembly.DefinedTypes.First().FullName);
您可以这样做:

instance.x = 42;
但请记住,我们在这里放弃了强类型,任何错误都将在运行时抛出


谢谢,请注意安全。

您希望以何种方式分配它们的值?比如
instance.x=42?这是不可能的。这是一个动态生成的程序集,只能使用reflectionOk进行操作。如果像
dynamic instance=\u assembly.CreateInstance(\u assembly.DefinedTypes.First().FullName)那样创建它您可以这样做:
instance.x=42@OguzOzgul就是他耍的把戏。谢谢。若我把它放在那个里,你们能标记为答案吗?:)如果类中有您希望存在的东西,我建议实现一个接口,或者从基类型派生。