Я пытаюсь открыть словарь только для чтения, содержащий объекты с интерфейсом только для чтения. Внутренне словарь может писать, а также объекты внутри (см. Ниже пример кода). Моя проблема в том, что 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; }
}