有没有一种方法可以根据我在运行时知道的类名创建一个类的实例。基本上,我会在字符串中拥有类的名称。
有没有一种方法可以根据我在运行时知道的类名创建一个类的实例。基本上,我会在字符串中拥有类的名称。
请查看Activator.CreateInstance方法。
var driver = (OpenQA.Selenium.IWebDriver)Activator.CreateInstance("WebDriver", "OpenQA.Selenium.Firefox.FirefoxDriver").Unwrap();
- Endy TjahjonoCar
,命名空间为Vehicles
,那么将参数传递为Vehicles.Car
,它将返回类型为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
代码-请参见https://dev59.com/P3E85IYBdhLWcg3wnU4d#2690661) - Tomer CaganstrFullyQualifiedName
前面加上 str
,fullyQualifiedName
就足够了。 - Mehdi Dehghanistr
作为变量命名约定的一部分被使用。某些组织和项目坚持遵循这一约定,因此我也使用了它。如果您曾在某些组织/项目中工作过,您就会知道这一点。正如您所说,没有 str
也可以完成工作 :) @MehdiDehghani - Sarath Subramanian我已经成功地使用了这种方法:
System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className)
您需要将返回的对象转换为所需的对象类型。
我的问题可能应该更具体一些。实际上,我知道一个字符串的基类,所以我通过以下方式解决了它:
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
Activator.CreateInstance类有不同的方法可以以不同的方式实现相同的功能。我本可以将其转换为对象,但上述方法对我的情况最有用。
要从解决方案中的另一个项目创建类的实例,您可以获取任何类(例如BaseEntity)指示的程序集并创建新实例:
var newClass = System.Reflection.Assembly.GetAssembly(typeof(BaseEntity)).CreateInstance("MyProject.Entities.User");
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
为什么要编写这样的代码?如果有一个类'ReportClass'可用,您可以直接实例化它,如下所示。
ReportClass report = new ReportClass();
当您没有必要的类可用,但希望动态实例化或调用方法时,代码ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
会被使用。
也就是说,在编写代码时您不具备ReportClass
类,但知道程序集时它是有用的。