使用字符串值创建新实例

时间:2010-05-06 03:23:42

标签: c# asp.net oop reflection types

我有几个类:SomeClass1,SomeClass2。

如何使用字符串中的类名创建其中一个类的新实例?

通常,我会这样做:

var someClass1 = new SomeClass1();

如何从以下内容创建此实例:

var className = "SomeClass1";

我假设我应该使用Type.GetType()或其他东西,但我无法理解。

感谢。

3 个答案:

答案 0 :(得分:4)

Assembly assembly = Assembly.LoadFrom("SomeDll.dll");    
var myinstance = assembly.CreateInstance("SomeNamespace.SomeClass1");

答案 1 :(得分:2)

首先,您需要通过reflection获取类型,然后您可以使用Activator创建它。

要获取该类型,请首先确定它所在的程序集。对于运行代码的当前程序集,请参阅Assembly.GetExecutingAssembly()。对于当前AppDomain中加载的所有程序集,请参阅AppDomain.CurrentDomain.GetAssemblies()。否则,请参阅Assembly.LoadFrom

然后,如果您有一个类名但没有名称空间,则可以通过Assembly.GetTypes()枚举程序集中的类型。

最后,使用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());
        }
    }
}

答案 2 :(得分:0)

为什么不使用依赖注入框架?这种类型的东西由Sprint.Net,Structure Map,NInject等依赖注入框架大大处理。