只讀的表示鍵和值(字典)的集合。 防止擅改集合。
/// <summary>
/// 只讀的表示鍵和值(字典)的集合。
/// </summary>
/// <typeparam name="TKey">字典中的鍵的類型。</typeparam>
/// <typeparam name="TValue">字典中的值的類型。</typeparam>
public class ReadOnlyDirectionary<TKey, TValue> : IDictionary<TKey, TValue>
{
/// <summary>
/// 用於保存被包裝的普通字典實例。
/// </summary>
private IDictionary<TKey, TValue> _dictionary;
/// <summary>
/// 初始化只讀字典類的新實例,該實例包裝了一個普通的字典實例。
/// </summary>
/// <param name="innerDirectionary">要包裝的普通字典實例。</param>
/// <remarks>
/// <para>只讀字典不會從包裝的普通字典中複製元素,而是直接暴露普通字典中具有隻讀特徵的成員。
/// 具有隻寫特徵的成員將被隱藏,如果強制調用,則會拋出<see cref="NotSupportedException"/>異常。</para>
/// </remarks>
/// <exception cref="ArgumentNullException">
/// <see cref="P:innerDirectionary"/>爲null。
/// </exception>
public ReadOnlyDirectionary(IDictionary<TKey, TValue> innerDirectionary)
{
if (innerDirectionary == null)
throw new ArgumentNullException();
_dictionary = innerDirectionary;
}
#region IDictionary<TKey,TValue>
/// <summary>
/// 在字典中添加一個帶有所提供的鍵和值的元素。
/// 此實現總是引發<see cref="NotSupportedException"/>異常。
/// </summary>
/// <param name="key">要添加的元素的鍵。</param>
/// <param name="value">要添加的元素的值。</param>
void IDictionary<TKey, TValue>.Add(TKey key, TValue value)
{
throw new NotSupportedException();
}
/// <summary>
/// 確定字典中是否包含指定的鍵。
/// </summary>
/// <param name="key">要在字典中定位的鍵。</param>
/// <returns>如果字典中包含具有指定鍵的元素,則爲true;否則爲false。</returns>
public bool ContainsKey(TKey key)
{
return _dictionary.ContainsKey(key);
}
/// <summary>
/// 獲取包含字典中的鍵的集合。
/// </summary>
public ICollection<TKey> Keys
{
get { return _dictionary.Keys; }
}
/// <summary>
/// 從字典中移除所指定的鍵的值。
/// 此實現總是引發<see cref="NotSupportedException"/>異常。
/// </summary>
/// <param name="key">要移除的元素的鍵。</param>
/// <returns>如果成功找到並移除該元素,則爲 true;否則爲 false。
/// 如果在字典中沒有找到 key,此方法則返回 false。</returns>
bool IDictionary<TKey, TValue>.Remove(TKey key)
{
throw new NotSupportedException();
}
/// <summary>
/// 獲取與指定的鍵相關聯的值。
/// </summary>
/// <param name="key">要獲取的值的鍵。</param>
/// <param name="value">當此方法返回值時,如果找到該鍵,便會返回與指定的鍵相關聯的值;
/// 否則,則會返回 value 參數的類型默認值。該參數未經初始化即被傳遞。</param>
/// <returns>如果字典包含具有指定鍵的元素,則爲 true;否則爲 false。</returns>
public bool TryGetValue(TKey key, out TValue value)
{
return _dictionary.TryGetValue(key, out value);
}
/// <summary>
/// 獲取包含字典中的值的集合。
/// </summary>
public ICollection<TValue> Values
{
get { return _dictionary.Values; }
}
/// <summary>
/// 獲取與指定的鍵相關聯的值。
/// </summary>
/// <param name="key">要獲取的值的鍵。</param>
/// <returns>與指定的鍵相關聯的值。如果找不到指定的鍵,
/// get操作便會引發<see cref="KeyNotFoundException"/>異常。</returns>
public TValue this[TKey key]
{
get { return _dictionary[key]; }
}
/// <summary>
/// 獲取與指定的鍵相關聯的值。
/// 調用set操作總是會引發<see cref="NotSupportedException"/>異常。
/// </summary>
/// <param name="key">要獲取的值的鍵。</param>
/// <returns>與指定的鍵相關聯的值。如果找不到指定的鍵,
/// get操作便會引發<see cref="KeyNotFoundException"/>異常。
/// 調用set操作總是會引發<see cref="NotSupportedException"/>異常。</returns>
TValue IDictionary<TKey, TValue>.this[TKey key]
{
get { return this[key]; }
set { throw new NotSupportedException(); }
}
#endregion
#region ICollection<KeyValuePair<TKey,TValue>>
/// <summary>
/// 在字典中添加一個帶有所提供的鍵和值的元素。
/// 此實現總是引發<see cref="NotSupportedException"/>異常。
/// </summary>
/// <param name="item">要添加的元素的鍵和值。</param>
void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> item)
{
throw new NotSupportedException();
}
/// <summary>
/// 從字典中移除所有項。
/// 此實現總是引發<see cref="NotSupportedException"/>異常。
/// </summary>
void ICollection<KeyValuePair<TKey, TValue>>.Clear()
{
throw new NotSupportedException();
}
/// <summary>
/// 確定集合中是否包含特定值。
/// </summary>
/// <param name="item">要在集合中定位的對象。</param>
/// <returns>如果在集合中找到<see cref="P:item"/>,則爲true;否則爲false。</returns>
public bool Contains(KeyValuePair<TKey, TValue> item)
{
return _dictionary.Contains(item);
}
/// <summary>
/// 從特定的數組索引開始,將集合中的元素複製到一個數組中。
/// </summary>
/// <param name="array">作爲從集合複製的元素的目標位置的一維數組。
/// 該數組必須具有從零開始的索引。</param>
/// <param name="arrayIndex"><see cref="P:array"/>中從零開始的索引,從此處開始複製。</param>
public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
{
_dictionary.CopyTo(array, arrayIndex);
}
/// <summary>
/// 獲取集合中包含的元素數。
/// </summary>
public int Count
{
get { return _dictionary.Count; }
}
/// <summary>
/// 獲取一個值,該值指示集合是否爲只讀。
/// 此實現總是返回true。
/// </summary>
public bool IsReadOnly
{
get { return true; }
}
/// <summary>
/// 從集合中移除特定對象的第一個匹配項。
/// 此實現總是引發<see cref="NotSupportedException"/>異常。
/// </summary>
/// <param name="item">要從集合中移除的對象。</param>
/// <returns>如果已從集合中成功移除<see cref="P:item"/>,則爲true;否則爲false。
/// 如果在原始集合中沒有找到<see cref="P:item"/>,該方法也會返回 false。</returns>
bool ICollection<KeyValuePair<TKey, TValue>>.Remove(KeyValuePair<TKey, TValue> item)
{
throw new NotSupportedException();
}
#endregion
#region IEnumerable<KeyValuePair<TKey,TValue>>
/// <summary>
/// 返回一個循環訪問集合的枚舉數。
/// </summary>
/// <returns>可用於循環訪問集合的枚舉數。</returns>
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
{
return _dictionary.GetEnumerator();
}
#endregion
#region IEnumerable
/// <summary>
/// 返回一個循環訪問集合的枚舉數。
/// </summary>
/// <returns>可用於循環訪問集合的枚舉數。</returns>
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return ((IEnumerable)_dictionary).GetEnumerator();
}
#endregion
}