読み取り専用インターフェイスを持つオブジェクトを保持する読み取り専用ディクショナリを公開しようとしています。内部的には、ディクショナリは書き込み可能であり、内部のオブジェクトも書き込み可能です (以下のコード例を参照)。私の問題は、質問here で概説されている理由により、 IReadOnlyDictionary が共変変換をサポートしていないことです。つまり、内部辞書を読み取り専用として公開することはできません。
私の質問は、内部辞書を IReadOnlyDictionary に変換する効率的な方法、またはこれを処理する他の方法はありますか? 私が考えることができるオプションは次のとおりです。
- 2 つの内部辞書を保持し、それらを同期させます。
- プロパティがアクセスされたときに新しいディクショナリを作成し、その中のすべてのオブジェクトをキャストします。
- 内部で使用する場合は、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; }
}