开发者

How can I make this simple C# generics factory work?

I have this design:

public interface IFactory<T> {
  T Create();
  T CreateWithSensibleDef开发者_如何学运维aults();
}

public class AppleFactory : IFactory<Apple> { ... }
public class BananaFactory : IFactory<Banana> { ... }
// ...

The fictitious Apple and Banana here do not necessarily share any common types (other than object, of course).

I don't want clients to have to depend on specific factories, so instead, you can just ask a FactoryManager for a new type. It has a FactoryForType method:

IFactory<T> FactoryForType<T>();

Now you can invoke the appropriate interface methods with something like FactoryForType<Apple>().Create(). So far, so good.

But there's a problem at the implementation level: how do I store this mapping from types to IFactory<T>s? The naive answer is an IDictionary<Type, IFactory<T>>, but that doesn't work since there's no type covariance on the T (I'm using C# 3.5). Am I just stuck with an IDictionary<Type, object> and doing the casting manually?


Unfortunately yes you are stuck with the manual casting. However this casting can be an implementation detail and not seen by the consumer. For example

public class FactoryMap { 
  private Dictionary<Type,object> _map = new Dictionary<Type,object>();
  public void Add<T>(IFactory<T> factory) {
    _map[typeof(T)] = factory;
  }
  public IFactory<T> Get<T>() {
    return (IFactory<T>)_map[typeof(T)];
  }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜