只讀的表示鍵和值(字典)的集合

只讀的表示鍵和值(字典)的集合。 防止擅改集合。


    /// <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

      
    }




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章