使用反射的简单工厂涉及在哈希表中存储(注册)各种类型名称及其对应的类类型,然后使用这个哈希表在工厂中生成对象。
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()?
发布于 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
发布于 2015-05-21 21:38:49
当将扩展产品类添加到位置(例如插件目录)时,反射非常有用。您有一个字符串列表来标识支持的插件,这些插件既可以定义在文本文件中(应用程序属性,它提供了额外的安全层),也可以通过(通过反射)扫描所述插件目录(如果有人可以将受黑客攻击的产品放到该目录中,则不太安全)。免责声明:我从未在C#中这样做过,但它在Java中运行得很好。除了新产品代码和最终修改属性文件之外,应用程序代码没有任何修改。
我不确定这始终是您问题中代码的策略(它来自哪里?)您可能想了解更多关于反射的不同策略,并结合http://www.codeproject.com/Articles/37547/Exploring-Factory-Pattern的简单工厂。
发布于 2015-05-21 22:28:07
那得看情况。有不同的场景需要不同的策略。如果在同一个程序集(或程序集列表)中定义了所有产品类型,那么我经常看到的一种策略是这样的:
var productTypes= from t in Assembly.GetExecutingAssembly().GetTypes()
where t.GetInterfaces().Contains(typeof(IProduct));然后为registerProduct()调用productTypes中的每个元素。
https://stackoverflow.com/questions/30376353
复制相似问题