C# 使用字符串值创建新实例

C# 使用字符串值创建新实例,c#,asp.net,oop,reflection,types,C#,Asp.net,Oop,Reflection,Types,我有几节课:一节课,二节课 如何使用字符串中的类名创建这些类之一的新实例 通常,我会: var someClass1 = new SomeClass1(); 如何从以下内容创建此实例: var className = "SomeClass1"; 我假设我应该使用Type.GetType()或其他什么,但我想不出来 谢谢。首先您需要完成输入,然后您可以使用创建 Assembly assembly = Assembly.LoadFrom("SomeDll.dll"); var myins

我有几节课:一节课,二节课

如何使用字符串中的类名创建这些类之一的新实例

通常,我会:

var someClass1 = new SomeClass1();
如何从以下内容创建此实例:

var className = "SomeClass1";
我假设我应该使用Type.GetType()或其他什么,但我想不出来


谢谢。

首先您需要完成输入,然后您可以使用创建

Assembly assembly = Assembly.LoadFrom("SomeDll.dll");    
var myinstance = assembly.CreateInstance("SomeNamespace.SomeClass1");
要获取类型,首先要确定它所在的程序集。有关运行代码的当前程序集,请参阅。有关当前AppDomain中加载的所有程序集,请参阅。否则,请参见

然后,如果您有类名但没有命名空间,则可以通过枚举程序集中的类型

最后,使用创建类型


为什么不使用依赖注入框架呢?。依赖注入框架(如Sprint.Net、Structure Map、NInject等)可以很好地处理这类事情。

是否有一组已知的类可以用来处理这些问题?或者任何.NET类都可以在您的代码中以这种方式使用吗?换句话说,如果我要求你列出所有这些类,你能简单地做到吗?我有一个类文件夹(文件名与类名匹配)。我正在使用T4模板在目录上循环,切掉“.cs”并尝试创建每个类的实例。这仅在该类不在命名空间中时有效,否则您需要类的全名才能使用
CreateInstance
。很好,离开名称空间在当前AppDomain中加载程序集是一件不好的事情,特别是当它已经加载时,在这种情况下会出现异常。如果确定它是同一个程序集,请使用Activator.CreateInstance。如果没有,请在加载的程序集中搜索类型。程序集已被引用,命名空间已导入。有没有一种方法可以在不必再次加载程序集的情况下执行此操作?
using System;
using System.Linq;
using System.Reflection;

namespace ReflectionTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly thisAssembly = Assembly.GetExecutingAssembly();
            Type typeToCreate = thisAssembly.GetTypes().Where(t => t.Name == "Program").First();

            object myProgram = Activator.CreateInstance(typeToCreate);

            Console.WriteLine(myProgram.ToString());
        }
    }
}