C# 有没有办法从使用roslyn在c中编译的内存中代码创建的类实例中访问属性#
我正在尝试创建一个简单的方法来编译一些任意类,然后使用.NETCore3.0和Roslyn编译器访问这些类的属性 我已经成功地编译了代码并创建了实例,但是它看起来是静态和私有的 代码如下:C# 有没有办法从使用roslyn在c中编译的内存中代码创建的类实例中访问属性#,c#,.net-core,compilation,roslyn,C#,.net Core,Compilation,Roslyn,我正在尝试创建一个简单的方法来编译一些任意类,然后使用.NETCore3.0和Roslyn编译器访问这些类的属性 我已经成功地编译了代码并创建了实例,但是它看起来是静态和私有的 代码如下: private void ExecuteOnCompileCommand() { var code = @" using System; name
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就是他耍的把戏。谢谢。若我把它放在那个里,你们能标记为答案吗?:)如果类中有您希望存在的东西,我建议实现一个接口,或者从基类型派生。