从一个string创build一个类的实例
有没有一种方法来创build一个类的实例,基于这个事实,我知道运行时类的名称。 基本上我会有一个string类的名称。
看看Activator.CreateInstance方法。
我已经成功地使用了这个方法:
System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)
您需要将返回的对象转换为所需的对象types。
它非常简单。 假设你的类名是Car
,命名空间是Vehicles
,然后将parameter passing为Vehicles.Car
,它返回Car
types的对象。 像这样,你可以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
可用。