我有几个类:SomeClass1,SomeClass2。
如何使用字符串中的类名创建其中一个类的新实例?
通常,我会这样做:
var someClass1 = new SomeClass1();
如何从以下内容创建此实例:
var className = "SomeClass1";
我假设我应该使用Type.GetType()或其他东西,但我无法理解。
感谢。
答案 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等依赖注入框架大大处理。