首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有反射C#的简单工厂

带有反射C#的简单工厂
EN

Stack Overflow用户
提问于 2015-05-21 14:13:24
回答 3查看 1.4K关注 0票数 2

使用反射的简单工厂涉及在哈希表中存储(注册)各种类型名称及其对应的类类型,然后使用这个哈希表在工厂中生成对象。

代码语言:javascript
复制
interface Product
{
    void foo();
}
class ProductFactory
{
    HashTable m_RegisteredProducts = new HashTable();
    public void registerProduct(string productID, Type p)    {
        m_RegisteredProducts.add(productID, p);
    }

    public Product createProduct(string productID){
        return (Product) new m_RegisteredProducts[productID];
    }
}

我不清楚注册新类型的过程何时发生,因为要使用的所有类型都将在运行时加载到哈希表中。在哪里调用registerProduct()?

  1. 在registerProduct类中的单个位置为所有不同的类调用ProductFactory ()是没有意义的,因为它将违背在朴素的开关/case方法上使用反射的目的。
  2. 如果在实现接口的所有类的类定义中调用registerProduct(),那么类的一个实例就是在/使用之后创建的,因此工厂总是会给出一个错误。
EN

回答 3

Stack Overflow用户

发布于 2015-05-21 14:22:45

您的代码不执行反射,因为它期望的是实现Product接口的实例,而不是类型。您需要addProduct来获取一个Type实例,检查它是否实现了Product接口,然后在createProduct中动态地创建它的实例(使用类似于type.GetConstructor(<constructor signature>).Invoke(<arguments>);的东西)

这是我很久以前写的一篇类似的文章:http://blixt.org/2009/06/05/getting-types-implementing-class-or-interface

票数 0
EN

Stack Overflow用户

发布于 2015-05-21 21:38:49

  1. 在registerProduct类中的单个位置为所有不同的类调用ProductFactory ()是没有意义的,因为它将违背在朴素的开关/case方法上使用反射的目的。

当将扩展产品类添加到位置(例如插件目录)时,反射非常有用。您有一个字符串列表来标识支持的插件,这些插件既可以定义在文本文件中(应用程序属性,它提供了额外的安全层),也可以通过(通过反射)扫描所述插件目录(如果有人可以将受黑客攻击的产品放到该目录中,则不太安全)。免责声明:我从未在C#中这样做过,但它在Java中运行得很好。除了新产品代码和最终修改属性文件之外,应用程序代码没有任何修改。

  1. 如果在实现接口的所有类的类定义中调用registerProduct(),则在/使用工厂之后创建类的实例,因此总是会出现错误。

我不确定这始终是您问题中代码的策略(它来自哪里?)您可能想了解更多关于反射的不同策略,并结合http://www.codeproject.com/Articles/37547/Exploring-Factory-Pattern的简单工厂。

票数 0
EN

Stack Overflow用户

发布于 2015-05-21 22:28:07

那得看情况。有不同的场景需要不同的策略。如果在同一个程序集(或程序集列表)中定义了所有产品类型,那么我经常看到的一种策略是这样的:

代码语言:javascript
复制
var productTypes= from t in Assembly.GetExecutingAssembly().GetTypes()
                  where t.GetInterfaces().Contains(typeof(IProduct));

然后为registerProduct()调用productTypes中的每个元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30376353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档