从一个string创build一个类的实例

有没有一种方法来创build一个类的实例,基于这个事实,我知道运行时类的名称。 基本上我会有一个string类的名称。

看看Activator.CreateInstance方法。

我已经成功地使用了这个方法:

 System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className) 

您需要将返回的对象转换为所需的对象types。

它非常简单。 假设你的类名是Car ,命名空间是Vehicles ,然后将parameter passing为Vehicles.Car ,它返回Cartypes的对象。 像这样,你可以dynamic地创build任何类的任何实例。

 public object GetInstance(string strFullyQualifiedName) { Type t = Type.GetType(strFullyQualifiedName); return Activator.CreateInstance(t); } 

如果您的完全限定名称 (即在这种情况下为Vehicles.Car )在另一个程序集中,则Type.GetType将为空。 在这种情况下,您可以遍历所有程序集并findType 。 为此,您可以使用下面的代码

 public object GetInstance(string strFullyQualifiedName) { Type type = Type.GetType(strFullyQualifiedName); if (type != null) return Activator.CreateInstance(type); foreach (var asm in AppDomain.CurrentDomain.GetAssemblies()) { type = asm.GetType(strFullyQualifiedName); if (type != null) return Activator.CreateInstance(type); } return null; } 

现在,如果你想调用一个参数化的构造函数,请执行以下操作

 Activator.CreateInstance(t,17); // Incase you are calling a constructor of int type 

代替

 Activator.CreateInstance(t); 

可能我的问题应该是更具体的。 我实际上知道一个string的基类,所以通过以下方式解决它:

 ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass)); 

Activator.CreateInstance类有不同的方法来以不同的方式实现相同的事情。 我可以把它扔到一个对象上,但是上面这个对我来说是最有用的。

我知道我迟到了,但是您要寻找的解决scheme可能是上述的组合,并使用界面来定义您的对象可公开访问的方面。

然后,如果所有以这种方式生成的类都实现了该接口,则可以将其作为接口types进行投射,并使用生成的对象进行处理。

您似乎已经描述了您要实施的解决scheme,但不是您要解决的问题。

也许你正在试图做一些可扩展的事情,在这种情况下,我build议你查看一下Managed Extensibility Framework 。

例如,如果您将各种types的值存储在数据库字段(存储为string)中,并将另一个字段的types名称(即String,bool,int,MyClass)存储,则可以从该字段数据中,使用上面的代码创build任何types的类,并使用第一个字段的值填充它。 这当然取决于你正在存储的types有一个方法来parsingstring到正确的types。 我已经使用了很多次将用户偏好设置存储在数据库中。

 ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass)); 

你为什么要写这样的代码? 如果你有一个类“ReportClass”可用,你可以直接实例化它,如下所示。

 ReportClass report = new ReportClass(); 

代码ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass)); 当你没有必要的可用类时使用,但是你想dynamic地实例化和/或调用一个方法。

我的意思是这是有用的,当你知道的程序集,但编写代码时,你没有类ReportClass可用。