使用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)
{..}
}
请建议正确的程序。
您可以使用带有约束的泛型
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());
如果允许,第二行可以正常编译,但在运行时就会崩溃。