我有一堆 MDI 子节点,它们都是以相同的方式创建的,为了减少冗余代码,我希望能够调用一个方法,向它传递一个字符串(子节点的名称),让它创建节点并将其添加到父级。
除了从类名的字符串创建类之外,我可以做所有的事情,我该怎么做?
我目前在我的一个应用程序中使用它来新建一个类
public static IMobileAdapter CreateAdapter(Type AdapterType)
{
return (IMobileAdapter)System.Activator.CreateInstance(AdapterType);
}
它返回一个实现 IMobileAdapter 的类的实例,但您可以同样轻松地将其与字符串一起使用:
public static IMyClassInterface CreateClass(string MyClassType)
{
return (IMyClassInterface)System.Activator.CreateInstance(Type.GetType(MyClassType));
}
使用类似于以下的代码调用它:
IMyClassInterface myInst = CreateClass("MyNamespace.MyClass, MyAssembly");
当然,在这种情况下,它创建的类必须实现接口 IMyClassInterface,但是使用类工厂,您可能会让所有类都实现相同的接口。
编辑:
参考您的评论,出于本次讨论的目的,将术语“程序集”视为您的 vb/cs 项目中的文件集。我假设您在单个项目 [程序集] 中完成所有这些工作,而不是分散在多个项目中。
在你的情况下,因为你的类将扩展 Form 对象,你会做这样的事情。
Form myInst = CreateClass("MyExtendedForm");
或者
Form myInst = CreateClass(Type.GetType("MyExtendedForm"));
取决于您是在 CreateClass 方法内还是在其外获得类型。您需要将实例转换为正确的类型才能访问任何自定义成员。考虑一下:
class MyCustomForm : Form
{
public int myCustomField{ get; set; }
}
我有一个自定义表单,它扩展了 Form 添加 myCustomField 属性。我想使用 Activator.CreateInstance() 来实例化它:
public static Form CreateClass(string InstanceName)
{
return (Form)System.Activator.CreateInstance(Type.GetType(InstanceName));
}
然后我使用以下方法调用它:
Form myInst = CreateClass("MyCustomForm");
所以现在我将我的自定义表单存储在 myInst 中。但是,要访问自定义属性 [myCustomField],您需要将您的实例转换为正确的形式:
int someVal = ((Type.GetType("MyCustomForm"))myInst).myCustomField;
Activator.CreateInstance(Type.GetType(typeName))
如果你有一个作为类名的字符串,那么你应该能够通过调用 Type.GetType(string) 从中获取一个 Type 对象。从该类型中,您应该能够使用反射来生成对象。