c#从string创建一个对象的实例

时间:2010-01-07 17:38:57

标签: c# class

我有一个字符串变量包含:

string classCode = "public class Person { public string Name{get;set;} }";

如何从classCode创建对象的实例? 像

object obj = CreateAnInstanceAnObject(classCode);

4 个答案:

答案 0 :(得分:6)

您需要使用CodeDom编译内存中的程序集,然后使用反射来创建类型。

这是sample article on MSDN that walks through the process of code generation

编译完代码后,可以使用Activator.CreateInstance创建代码实例。

答案 1 :(得分:3)

answersabove上构建,这是一个从内存汇编生成,编译和实例化类的工作演示:

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)

以下项目应指导您完成的工作:

RunTime Code Compilation

但是,如果您尝试在运行时编写代码,则可能需要重新考虑您的体系结构。你可能会为自己创造一个比你需要更多的头痛。

你想通过创建这个对象来实现什么目标?