在C#中使用字符串和接口字典

Sar*_*nan 2 c# generics

我有一个名为IObSrc的接口,我有几个实现此接口的类,称为ObSrc1,ObScr2等.

Interface IObSrc
{
  string id;
}
Run Code Online (Sandbox Code Playgroud)

我还有一个名为IDtSrc的接口,这个接口由一些名为DtSrc1,DtSrc2的类实现.

Interface IDtSrc
{
  IObSrc getObject();
  Dictionary<string,IObSrc> getObjects();
}
Run Code Online (Sandbox Code Playgroud)

当我从DtSrc1实现这个接口,并且我从DtSrc1返回ObSrc1时,没有问题,但是当我返回Dictionary<string,ObSrc1>或者Dictionary<string,ObSrc2>,我得到了typemismatch的指示.

public class DtSrc : IDtSrc
{
  public Dictionary<string,IObSrc> getObjects()
  {
    Dictionary<string,ObSrc1> val1 = new ...'
    ...
    return val1;
  }

}
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题.

*已编辑*

我还有一个查询,如果一个方法应该返回一个可以通过实现改变的泛型类型.

示例:

interface IDtSrc<T> where T:IObSrc
{ 
  T ExecuteObject(string objId);
}
Run Code Online (Sandbox Code Playgroud)

这将用作

class DtSrc1 
{ 
  string ExecuteObject(string objId)
  {..}
}
Run Code Online (Sandbox Code Playgroud)

class DtSrc2
{ 
 Dictionary<string,string> ExecuteObject(string objId)
 {..}
}
Run Code Online (Sandbox Code Playgroud)

请为此建议正确的程序.

Yur*_*ich 6

您可以使用具有约束的泛型

interface IDtSrc<T> where T:IObSrc
{
  IObSrc getObject();
  Dictionary<string,T> getObjects();
}
Run Code Online (Sandbox Code Playgroud)

但是你的实现IDtSrc只能返回一种类型IObSrc.


Ada*_*kis 5

如果声明类型字典Dictionary<string,IObSrc>,则无法以任何方式替换具有不同类型参数的字典,即使新类型参数继承自原始字体也是如此.这就是原因Dictionary<string, ObSrc1>并且Dictionary<string, ObSrc2>失败了.

您要实现的目标称为类型协方差,并且不支持它Dictionary<TKey, TValue>.只有"只读"的集合才支持类型协方差IEnumerable<T>.

这可能看起来很愚蠢,但考虑一下否则会发生什么:

Dictionary<string, IObSrc> dict = new Dictionary<string, ObSrc1>(); //illegal
dict.Add("X", new Obsrc2());
Run Code Online (Sandbox Code Playgroud)

如果这是允许的,第二行将编译正常,但在运行时爆炸.