【发布时间】:2013-10-10 11:53:20
【问题描述】:
我有一个泛型接口,其中包含两个具有严格泛型约束的类型参数,以及针对不同组合的多个实现。
public interface IResolver<TIn, TOut> where ... {...}
我想创建一个(静态)解析器工厂,它将存储已知实现的实例,并按照以下方式为它们提供服务:
public static ResolverFactory{
public static IResover<TIn, TOut> GetResolver<TIn, TOut> where ... ()
{
//access some storage dictionary to return the correctly typed instance
}
}
如何创建这样一个容器,它可以同时存储IResover<Entity1, Entity2> 和IResolver<Entity3, Entity4>?
我能想到的一个选择是使用单独的非通用“标记”接口,例如:
public interface IResolver {}
public interface IResolver<TIn, TOut> : IResolver where ....
{...}
并使用
Dictionary<Type, Dictionary <Type, IResolver>> storage;
public RegisterResolver(IResolver resolver)
{
//add to storage - how?
}
但这种情况基本上会使泛型参数上的约束无效。
此外,当添加IResolver 时,获得IResolver<TIn, TOut> 的泛型类型或多或少是不可能的。
有没有更好的解决方案?
【问题讨论】:
-
我不会说它会使约束无效。它仍然是
IResolver<TIn, TOut>的实例。 -
我不确定我是否理解您的无效约束问题。这些约束仅在您的 ResolverFactory 之外很重要,并且由您的
GetResolve<TIn, TOut>方法的签名强制执行。在 ResolverFactory 内部,存储对象的方式并不重要。 -
@KooKiz: 是的,
GetResolver方法也有同样的限制,因此不可能得到无效结果,但仍然可以注册一个IResolver实现,即不是IResolver<TIn, TOut> -
也许我错过了什么,常见的 IResolver 接口看起来不错,但你为什么不让 RegisterResolver 通用呢? public RegisterResolver
(IResolver 解析器)