Answers:
看一下Activator.CreateInstance方法。
var driver = (OpenQA.Selenium.IWebDriver)Activator.CreateInstance("WebDriver", "OpenQA.Selenium.Firefox.FirefoxDriver").Unwrap();
非常简单。假设您的类名是Car
,名称空间是Vehicles
,然后传递参数,Vehicles.Car
该参数返回type的对象Car
。这样,您可以动态创建任何类的任何实例。
public object GetInstance(string strFullyQualifiedName)
{
Type t = Type.GetType(strFullyQualifiedName);
return Activator.CreateInstance(t);
}
如果您的全名(例如,Vehicles.Car
在本例中)在另一个程序集中,则该名称Type.GetType
将为null。在这种情况下,您将遍历所有程序集并找到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);
dynamic
代码-见stackoverflow.com/a/2690661/904521)
strFullyQualifiedName
用str
,fullyQualifiedName
将做的工作。
str
用作变量命名约定的一部分。某些组织和项目坚持要遵循此原则,因此我使用了。如果您曾在某些组织机构/项目中工作过,您将知道这一点。正如您所说的,str
它也可以完成工作:) @MehdiDehghani
我已成功使用此方法:
System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)
您需要将返回的对象转换为所需的对象类型。
也许我的问题应该更具体。我实际上知道该字符串的基类,因此通过以下方式解决了该问题:
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
Activator.CreateInstance类具有多种方法,可以以不同的方式实现同一件事。我本可以将其转换为对象,但以上内容对我的情况最有用。
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
您为什么要编写这样的代码?如果您有可用的类“ ReportClass”,则可以直接实例化它,如下所示。
ReportClass report = new ReportClass();
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
当您没有必要的可用类,但要实例化和/或动态调用方法时,将使用该代码。
我的意思是,当您了解程序集时它很有用,但是在编写代码时您没有ReportClass
可用的类。