繁体   English   中英

C#中的工厂模型

[英]Factory Model in C#

我有一堆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对象。 从该类型,您应该能够使用反射来生成对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM