使用字符串值创建新实例
我有几个类:SomeClass1,SomeClass2。
如何使用字符串中的类名创建其中一个类的新实例?
通常,我会这样做:
var someClass1 = new SomeClass1();
如何从以下创建此实例:
var className = "SomeClass1";
我假设我应该使用Type.GetType()或其他东西,但我无法弄明白。
谢谢。
首先,您需要通过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()); } } }
Assembly assembly = Assembly.LoadFrom("SomeDll.dll"); var myinstance = assembly.CreateInstance("SomeNamespace.SomeClass1");
为什么不dependency injection框架? 这种类型的东西由Sprint.Net,Structure Map,NInject等dependency injection框架大大处理。