我已阅读相关问题(How to get around lack of covariance with IReadOnlyDictionary?),但我不明白它对我的问题有何帮助。
以下Box
可以编辑(使用IBoxTarget
)并通知有关更改(使用IBoxSource
):
interface IBoxTarget
{
void DoSomething();
}
interface IBoxSource
{
event Action SomethingIsDone;
}
class Box : IBoxTarget, IBoxSource
{
public void DoSomething()
{
// . . . some logic . . .
if (SomethingIsDone != null) SomethingIsDone();
}
public event Action SomethingIsDone;
}
Room
是Box
的容器。它还实现了两个接口:
interface IRoomTarget
{
IReadOnlyDictionary<string, IBoxTarget> Boxes { get; }
}
interface IRoomSource
{
IReadOnlyDictionary<string, IBoxSource> Boxes { get; }
}
class Room : IRoomTarget, IRoomSource
{
Dictionary<string, Box> boxes = new Dictionary<string, Box>();
IReadOnlyDictionary<string, IBoxTarget> IRoomTarget.Boxes
{
get { return boxes; } // Error: "Cannot implicitly convert type ..."
}
IReadOnlyDictionary<string, IBoxSource> IRoomSource.Boxes
{
get { return boxes; } // Error: "Cannot implicitly convert type ..."
}
}
我不想在Room
内创建两个不同的词典。我需要做什么?
答案 0 :(得分:0)
在我的特殊情况下,这有助于:
interface IRoomTarget
{
IBoxTarget this[string name] { get; }
}
interface IRoomSource
{
IBoxSource this[string name] { get; }
}
class Room : IRoomTarget, IRoomSource
{
Dictionary<string, Box> boxes = new Dictionary<string, Box>();
public IBoxTarget IRoomTarget.this[string name]
{
get { return boxes[name]; }
}
IBoxSource IRoomSource.this[string name]
{
get { return boxes[name]; }
}
}
但我不确定这是通用解决方案