繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM