यह एक बुरा समाधान है, नीचे देखें।
अभी भी .NET 4.0 या इससे पहले का उपयोग करने वालों के लिए, मेरे पास एक वर्ग है जो स्वीकृत उत्तर में एक की तरह काम करता है, लेकिन यह बहुत छोटा है। यह मौजूदा डिक्शनरी ऑब्जेक्ट का विस्तार करता है, कुछ सदस्यों को ओवरराइडिंग (वास्तव में छिपाना) जब उन्हें बुलाया जाता है तो उन्हें एक अपवाद फेंकने के लिए।
यदि कॉलर ऐड, रिमूव या कुछ अन्य म्यूटिंग ऑपरेशन को कॉल करने का प्रयास करता है जो अंतर्निहित शब्दकोश में है, तो कंपाइलर एक त्रुटि फेंक देगा। मैं इन संकलक त्रुटियों को बढ़ाने के लिए अप्रचलित विशेषताओं का उपयोग करता हूं। इस तरह, आप इस रीडऑनलाइडर के साथ एक शब्दकोश को बदल सकते हैं और तुरंत देख सकते हैं कि आपके आवेदन को चलाने और रन-टाइम अपवादों की प्रतीक्षा किए बिना कोई समस्या कहां हो सकती है।
जरा देखो तो:
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(); }
}
इस समाधान में यहाँ वर्णित @supercat द्वारा बताई गई समस्या है:
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);
}
एक संकलन-समय त्रुटि देने की बजाय जैसे मुझे उम्मीद थी, या एक रनटाइम-अपवाद जैसे मुझे उम्मीद थी, यह कोड त्रुटि के बिना चलता है। यह चार नंबर प्रिंट करता है। यह मेरा ReadOnlyDictionary एक ReadWriteDictionary बनाता है।