我正在尝试公开一个只读字典,该字典包含具有只读接口的对象。在内部,字典是可写的,其中的对象也是可写的(参见下面的示例代码)。我的问题是 IReadOnlyDictionary 不支持协变转换,因为这里的问题中列出了原因。这意味着我不能将我的内部字典公开为只读字典。
所以我的问题是,有没有一种有效的方法可以将我的内部字典转换为 IReadOnlyDictionary,或者其他方式来处理这个问题?我能想到的选项是:
- 持有两个内部词典并保持同步。
- 访问属性时创建一个新字典并转换其中的所有对象。
- 在内部使用时将 IReadOnly 转换回 NotReadOnly。
1似乎很痛苦,2似乎效率很低。3 听起来是目前最有前途的,但仍然很难看。我还有其他选择吗?
public class ExposesReadOnly
{
private Dictionary<int, NotReadOnly> InternalDict { get; set; }
public IReadOnlyDictionary<int, IReadOnly> PublicList
{
get
{
// This doesn't work...
return this.InternalDict;
}
}
// This class can be modified internally, but I don't want
// to expose this functionality.
private class NotReadOnly : IReadOnly
{
public string Name { get; set; }
}
}
public interface IReadOnly
{
string Name { get; }
}