Create an instance of a class from a string
有没有办法根据我在运行时知道类的名称来创建类的实例。 基本上我会在字符串中有类的名称。
看一下Activator.CreateInstance方法。
它非常简单。假设您的类名是
1 2 3 4 5 | public object GetInstance(string strFullyQualifiedName) { Type t = Type.GetType(strFullyQualifiedName); return Activator.CreateInstance(t); } |
如果您的完全限定名称(即本例中的
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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; } |
现在,如果要调用参数化构造函数,请执行以下操作
1 | Activator.CreateInstance(t,17); // Incase you are calling a constructor of int type |
代替
1 | Activator.CreateInstance(t); |
我成功地使用了这个方法:
1 | System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(string className) |
您需要将返回的对象强制转换为所需的对象类型。
可能我的问题应该更加具体。我实际上知道字符串的基类,所以解决了它:
1 | ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass)); |
Activator.CreateInstance类有各种方法以不同的方式实现相同的功能。我可以将它投射到一个物体,但上面对我的情况最有用。
我知道我已经迟到了...但你正在寻找的解决方案可能是上述的组合,并使用界面来定义对象的公共可访问方面。
然后,如果以这种方式生成的所有类都实现了该接口,则可以将其转换为接口类型并使用生成的对象。
要从解决方案中的另一个项目创建类的实例,您可以获取由任何类的名称指示的程序集(例如BaseEntity)并创建一个新实例:
1 | var newClass = System.Reflection.Assembly.GetAssembly(typeof(BaseEntity)).CreateInstance("MyProject.Entities.User"); |
例如,如果您将各种类型的值存储在数据库字段中(存储为字符串)并且具有另一个具有类型名称的字段(即String,bool,int,MyClass),那么从该字段数据中,您可以想象,使用上面的代码创建任何类型的类,并使用第一个字段中的值填充它。这当然取决于您存储的类型,其具有将字符串解析为正确类型的方法。我已经多次使用它来将用户首选项设置存储在数据库中。
1 | ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass)); |
你为什么要写这样的代码?如果您有一个类'ReportClass'可用,您可以直接实例化它,如下所示。
1 |
如果没有必要的类,但是想要动态实例化和/或调用方法,则使用代码
我的意思是,当你知道汇编时,它是有用的,但在编写代码时,你没有类