我有一个字符串变量包含:
string classCode = "public class Person { public string Name{get;set;} }";
如何从classCode创建对象的实例? 像
object obj = CreateAnInstanceAnObject(classCode);
答案 0 :(得分:6)
您需要使用CodeDom编译内存中的程序集,然后使用反射来创建类型。
这是sample article on MSDN that walks through the process of code generation。
编译完代码后,可以使用Activator.CreateInstance创建代码实例。
答案 1 :(得分:3)
在answers的above上构建,这是一个从内存汇编生成,编译和实例化类的工作演示:
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();
}
}
}
答案 2 :(得分:1)
简单地说,当你尝试时,你不能在一行中做到这一点。可以通过它的名称和Activator.CreateInstance
的重载之一来创建现有类的实例。
你想要在这里实现的是完全不同的。您正在尝试同时1)定义新的类类型和2)创建它的实例。使用C#等静态语言很难实现动态定义运行过程中的新元数据。它需要大量的工作,不能轻易放入StackOverflow答案。
答案 3 :(得分:0)
以下项目应指导您完成的工作:
但是,如果您尝试在运行时编写代码,则可能需要重新考虑您的体系结构。你可能会为自己创造一个比你需要更多的头痛。
你想通过创建这个对象来实现什么目标?