0

我有这个问题,我觉得可以通过多种方式解决,但不确定最有效的方法是什么。在 SO at collection of different generic types上发现了同样的问题,但似乎没有任何解决方案。我想复活这个问题并挑选专家的大脑!

就我而言,我有一份合同:

public interface IServiceInvoker<TServiceContract>
{
}

实际上这也涉及到一个抽象类来集中一些核心代码,但我不打算在这里包含它,以免问题变得过于复杂。

TServiceContract 类型可以是任何服务接口。因此它不限于任何特定类型,因为实现类将验证服务等。然后我有这个类(下面的 ServiceDAO)来封装这个和其他引用的基本使用。我正在尝试创建 IServiceInvoker 类型的集合属性,但没有运气......基本上我所拥有的是:

public class ServiceDAO
{
    private Dictionary<string, object> _serviceInvocationCollection = new Dictionary<string, object>();

    public IEnumerable<KeyValuePair<string, object>> ServiceInvocationCollection
    {
        get { return _serviceInvocationCollection.AsEnumerable<KeyValuePair<string,object>>(); }
        private set { _serviceInvocationCollection = value as Dictionary<string, object>; }
    }
}

我宁愿集合是 IServiceInvoker 的类型,但不能在类级别指定 TServiceContract 类型,因为集合可以使用任意数量的 IServiceInvoker 实现类...使用对象代替似乎过于松散类型.. . 任何想法或建议表示赞赏!

4

2 回答 2

1

简单的方法

只需添加另一个非通用接口:

public interface IServiceInvokerUntyped
{
}

public interface IServiceInvoker<TServiceContract> : IServiceInvokerUntyped
{
}

像这样声明字典:

private Dictionary<string, IServiceInvokerUntyped> _serviceInvocationCollection = new Dictionary<string, IServiceInvokerUntyped>();

变体方法

如果您的泛型类型参数可以声明为协变:

public interface IServiceInvoker<out T> : IServiceInvokerUntyped
{
}

像这样声明字典:

private Dictionary<string, IServiceInvoker<object>> _serviceInvocationCollection = new Dictionary<string, IServiceInvoker<object>>();

对于逆变,只需将 'out' 更改为 'in' 并根据需要修改字典声明/初始化。

于 2013-07-16T20:27:37.400 回答
1

也许定义一个通用接口继承的基本接口;然后你就可以收藏了Dictionary<string, IServiceInvoker>

public interface IServiceInvoker { }
public interface IServiceInvoker<TServiceContract> : IServiceInvoker
{
}

或者,您可以定义对TServiceContract类型参数的限制,例如IServiceContract和 use Dictionary<string, IServiceInvoker<IServiceContract>>。但是当然每个服务都必须继承IServiceContract.

public interface IServiceContract { }
public interface IServiceInvoker<TServiceContract>
    where TServiceContract : IServiceContract
{
}
于 2013-07-16T20:27:54.653 回答