从字符串创建类的实例

是否有一种方法可以基于我在运行时知道类的名称这一事实来创建类的实例。基本上,我将类名放在字符串中。

323747 次浏览

我曾经成功地使用过这个方法:

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

您需要将返回的对象强制转换为所需的对象类型。

也许我的问题应该更具体些。我实际上知道一个基类的字符串,所以解决它:

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

激活。CreateInstance类有各种方法以不同的方式实现相同的功能。我可以将它转换为一个对象,但上面的方法对我的情况最有用。

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

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

ReportClass report = new ReportClass();

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

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

例如,如果您在数据库字段中存储了各种类型的值(存储为字符串),并且有另一个具有类型名称的字段(即string, bool, int, MyClass),那么从该字段数据中,您可以使用上述代码创建任何类型的类,并使用第一个字段的值填充它。当然,这取决于您存储的类型是否有方法将字符串解析为正确的类型。我曾多次使用这种方法在数据库中存储用户首选项设置。

我知道我来晚了……但是,您正在寻找的解决方案可能是上述方法的结合,并使用接口定义对象的公共可访问方面。

然后,如果以这种方式生成的所有类都实现了该接口,则可以将其转换为接口类型并使用结果对象。

这很简单。假设你的类名是Car,命名空间是Vehicles,然后将参数传递为Vehicles.Car,返回类型为Car的对象。像这样,您可以动态地创建任何类的任何实例。

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

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

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);

要从解决方案中的另一个项目中创建类的实例,您可以获得由任何类的名称指示的程序集(例如BaseEntity)并创建一个新实例:

  var newClass = System.Reflection.Assembly.GetAssembly(typeof(BaseEntity)).CreateInstance("MyProject.Entities.User");