题
我有一堆被以相同的方式创建的所有且尽量减少冗余码我想能够调用一个方法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 myInst = CreateClass("MyExtendedForm");
或者
Form myInst = CreateClass(Type.GetType("MyExtendedForm"));
根据是否让你CreateClass方法之内或之外它的类型。您需要到您的实例转换为正确的类型,以便访问任何自定义成员。考虑这样的:
class MyCustomForm : Form
{
public int myCustomField{ get; set; }
}
我已经得到了延伸形式加入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(字符串)。从这种类型的,你应该能够使用反射来生成一个对象。
不隶属于 StackOverflow