Bu kötü bir çözüm, aşağıya bakın.
Hala .NET 4.0 veya önceki sürümleri kullananlar için, kabul edilen yanıttaki gibi çalışan bir sınıfım var, ancak çok daha kısa. Varolan Dictionary nesnesini genişleterek, belirli üyeleri çağrıldığında bir istisna atmalarını sağlamak için geçersiz kılar (aslında gizler).
Arayan, yerleşik Sözlüğün sahip olduğu Ekle, Kaldır veya başka bir mutasyon işlemini çağırmaya çalışırsa, derleyici bir hata atar. Bu derleyici hatalarını yükseltmek için eski öznitelikleri kullanın. Bu şekilde, bir Sözlüğü bu ReadOnlyDictionary ile değiştirebilir ve uygulamanızı çalıştırmak zorunda kalmadan ve çalışma zamanı istisnalarını beklemeden herhangi bir sorunun nerede olabileceğini hemen görebilirsiniz.
Bir göz at:
public class ReadOnlyException : Exception
{
}
public class ReadOnlyDictionary<TKey, TValue> : Dictionary<TKey, TValue>
{
public ReadOnlyDictionary(IDictionary<TKey, TValue> dictionary)
: base(dictionary) { }
public ReadOnlyDictionary(IDictionary<TKey, TValue> dictionary, IEqualityComparer<TKey> comparer)
: base(dictionary, comparer) { }
//The following four constructors don't make sense for a read-only dictionary
[Obsolete("Not Supported for ReadOnlyDictionaries", true)]
public ReadOnlyDictionary() { throw new ReadOnlyException(); }
[Obsolete("Not Supported for ReadOnlyDictionaries", true)]
public ReadOnlyDictionary(IEqualityComparer<TKey> comparer) { throw new ReadOnlyException(); }
[Obsolete("Not Supported for ReadOnlyDictionaries", true)]
public ReadOnlyDictionary(int capacity) { throw new ReadOnlyException(); }
[Obsolete("Not Supported for ReadOnlyDictionaries", true)]
public ReadOnlyDictionary(int capacity, IEqualityComparer<TKey> comparer) { throw new ReadOnlyException(); }
//Use hiding to override the behavior of the following four members
public new TValue this[TKey key]
{
get { return base[key]; }
//The lack of a set accessor hides the Dictionary.this[] setter
}
[Obsolete("Not Supported for ReadOnlyDictionaries", true)]
public new void Add(TKey key, TValue value) { throw new ReadOnlyException(); }
[Obsolete("Not Supported for ReadOnlyDictionaries", true)]
public new void Clear() { throw new ReadOnlyException(); }
[Obsolete("Not Supported for ReadOnlyDictionaries", true)]
public new bool Remove(TKey key) { throw new ReadOnlyException(); }
}
Bu çözüm, burada gösterilen @supercat tarafından belirtilen bir soruna sahiptir:
var dict = new Dictionary<int, string>
{
{ 1, "one" },
{ 2, "two" },
{ 3, "three" },
};
var rodict = new ReadOnlyDictionary<int, string>(dict);
var rwdict = rodict as Dictionary<int, string>;
rwdict.Add(4, "four");
foreach (var item in rodict)
{
Console.WriteLine("{0}, {1}", item.Key, item.Value);
}
Beklediğim gibi bir derleme zamanı hatası veya umduğum gibi bir çalışma zamanı özel durumu vermek yerine, bu kod hatasız çalışır. Dört sayı basar. Bu benim ReadOnlyDictionary bir ReadWriteDictionary yapar.