[英]c# create an instance of an object from string
我有一个字符串变量包含:
string classCode = "public class Person { public string Name{get;set;} }";
如何从classCode创建对象的实例? 喜欢
object obj = CreateAnInstanceAnObject(classCode);
您需要使用CodeDom编译内存中的程序集,然后使用反射来创建该类型。
这是MSDN上的一篇示例文章,介绍了代码生成过程 。
编译完代码后,可以使用Activator.CreateInstance创建它的实例。
在构建答案从上面 ,下面是一个工作演示,以生成,编译并从内存组件实例化一个类:
namespace DynamicCompilation
{
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.CSharp;
internal static class Program
{
private static void Main()
{
var ccu = new CodeCompileUnit();
var cns = new CodeNamespace("Aesop.Demo");
cns.Imports.Add(new CodeNamespaceImport("System"));
var ctd = new CodeTypeDeclaration("Test")
{
TypeAttributes = TypeAttributes.Public
};
var ctre = new CodeTypeReferenceExpression("Console");
var cmie = new CodeMethodInvokeExpression(ctre, "WriteLine", new CodePrimitiveExpression("Hello World!"));
var cmm = new CodeMemberMethod
{
Name = "Hello",
Attributes = MemberAttributes.Public
};
cmm.Statements.Add(cmie);
ctd.Members.Add(cmm);
cns.Types.Add(ctd);
ccu.Namespaces.Add(cns);
var provider = new CSharpCodeProvider();
var parameters = new CompilerParameters
{
CompilerOptions = "/target:library /optimize",
GenerateExecutable = false,
GenerateInMemory = true
};
////parameters.ReferencedAssemblies.Add("System.dll");
var results = provider.CompileAssemblyFromDom(parameters, ccu);
if (results.Errors.Count == 0)
{
var t = results.CompiledAssembly.GetType("Aesop.Demo.Test");
var inst = results.CompiledAssembly.CreateInstance("Aesop.Demo.Test");
t.InvokeMember("Hello", BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, null, inst, null);
}
Console.ReadLine();
}
}
}
简单的说,你在尝试时不能在一行中做到这一点。 可以通过它的名称和Activator.CreateInstance
一个重载来创建现有类的实例。
你想在这里实现的是完全不同的。 您正在尝试同时1)定义新的类类型和2)创建它的实例。 使用C#等静态语言很难实现动态定义运行过程中的新元数据。 它需要大量的工作,不能轻易放入StackOverflow答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.