Próbuję odsłonić słownik tylko do odczytu, który przechowuje obiekty z interfejsem tylko do odczytu. Wewnętrznie słownik jest zdolny do zapisu, podobnie jak obiekty wewnątrz (zobacz poniżej przykładowy kod). Mój problem polega na tym, że IReadOnlyDictionary nie obsługuje konwersji kowariancyjnych z powodu przyczyny opisanej w pytaniu here. Oznacza to, że nie mogę po prostu odsłonić mojego wewnętrznego słownika jako tylko do odczytu.Jak obejść brak kowariancji za pomocą IReadOnlyDictionary?
Moje pytanie brzmi: czy istnieje skuteczny sposób na konwersję mojego wewnętrznego słownika na IReadOnlyDictionary lub w jakiś inny sposób, aby poradzić sobie z tym? Opcje, o których mogę pomyśleć to:
- Trzymaj dwa wewnętrzne słowniki i synchronizuj je.
- Utwórz nowy słownik, gdy właściwość jest dostępna i rzucić wszystkie obiekty w środku.
- Prześlij IReadOnly z powrotem do NotReadOnly, gdy używasz go wewnętrznie.
1 wydaje się być bólem, 2 wydaje się bardzo nieefektywne. 3 brzmi jak najbardziej obiecujący w tej chwili, ale wciąż jest brzydki. Czy mam jakieś inne opcje?
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; }
}
+1 Zrobiłem coś takiego, kiedy potrzebowałem słownika, który miał zarówno zmienne, jak i niezmienne widoki. –
jest to bardziej jak widok tylko do odczytu słownika. Sam słownik wciąż może się zmienić. – vidstige
@vidstige, "Sam słownik wciąż może się zmienić" - oczywiście, dlatego jest prywatny. – Joe