使用c#中字符串和接口的字典

本文关键字:接口 字典 字符串 使用 | 更新日期: 2023-09-27 18:17:44

我有一个接口称为IObSrc,我有几个类实现这个接口称为ObSrc1, obsrr2等。

Interface IObSrc
{
  string id;
}

我也有一个叫做IDtSrc的接口,这个接口是由几个叫做DtSrc1, DtSrc2的类实现的。

Interface IDtSrc
{
  IObSrc getObject();
  Dictionary<string,IObSrc> getObjects();
}

当我从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;
  }
}

如何解决这个问题?

* EDITED *

我还有一个查询,如果一个方法应该返回一个可以随实现而变化的泛型类型该怎么办?

:

interface IDtSrc<T> where T:IObSrc
{ 
  T ExecuteObject(string objId);
}

这将被用作

class DtSrc1 
{ 
  string ExecuteObject(string objId)
  {..}
}

class DtSrc2
{ 
 Dictionary<string,string> ExecuteObject(string objId)
 {..}
}

请建议正确的程序。

使用c#中字符串和接口的字典

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

interface IDtSrc<T> where T:IObSrc
{
  IObSrc getObject();
  Dictionary<string,T> getObjects();
}

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

如果声明Dictionary<string,IObSrc>类型的字典,则不能用任何方式不同的类型参数替换字典,即使新类型参数继承于原始类型参数。这就是Dictionary<string, ObSrc1>Dictionary<string, ObSrc2>失败的原因。

你想要实现的是所谓的类型协方差,它不支持Dictionary<TKey, TValue>。类型covariance只支持"只读"的集合,即IEnumerable<T>

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

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

如果允许,第二行可以正常编译,但在运行时就会崩溃。