gpt4 book ai didi

c# - C#中的工厂模型

转载 作者:太空狗 更新时间:2023-10-29 22:35:29 25 4
gpt4 key购买 nike

我有一堆 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 接口(interface),但是对于类工厂,您很可能会让所有类实现相同的接口(interface)。

编辑:

引用您的评论,出于本次讨论的目的,将术语“程序集”视为您的 vb/cs 项目中的一组文件。我假设您是在单个项目 [程序集] 中执行所有这些操作,而不是分布在多个项目中。

在你的情况下,因为你的类将扩展 Form 对象,你会做这样的事情。

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;

关于c# - C#中的工厂模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/473275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com