我正在尝试暴露一个只读字典,其中包含具有只读接口的对象。在内部,字典是可写的,其中的对象也是可写的(请参见下面的示例代码)。我的问题是,IReadOnlyDictionary不支持协变转换,因为在此处概述的原因。这意味着我不能将我的内部字典仅作为只读字典公开。
所以我的问题是,是否有一种有效的方法可以将我的内部字典转换为IReadOnlyDictionary,或者其他处理此问题的方法?我能想到的选项是:
所以我的问题是,是否有一种有效的方法可以将我的内部字典转换为IReadOnlyDictionary,或者其他处理此问题的方法?我能想到的选项是:
- 持有两个内部字典并保持它们同步。
- 当访问属性时创建一个新的字典并强制转换其中的所有对象。
- 在内部使用时将IReadOnly的转换回NotReadOnly。
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; }
}