Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

Session値を取得と同時に削除するメソッドを拡張メソッドで実装する その2

以下のエントリーを改良してみます。
Session値を取得と同時に削除するメソッドを拡張メソッドで実装する - プログラマーな日々
Session値を一時的なデーター渡しに使う場合、値を取得直後に削除したい場合があります。でもSystem.Web.SessionState.HttpSessionStateクラスにはそのようなメソッドは用意されていません。そこで拡張メソッドを使い実装してみます。 ...

どういうこと?

セッション値が格納されていない場合に、例外をスローするか、それともnullを返却するかを指定する引数を追加します。

どうすれば?

ソースコードを晒します。ついでに引数指定を省略できるオーバーロードも追加してみました。

using System;
using System.Web.SessionState;

namespace Extensions {
    public static class SystemWebSessionStateExtensions {

        #region HttpSessionState 

        /// <summary>
        /// セッション値を取得し、そのセッション値を削除します。
        /// </summary>
        /// <param name="self">HttpSessionStateのインスタンス。</param>
        /// <param name="index">セッション値の数値インデックス。</param>
        /// <returns>取得したセッション値。</returns>
        /// <exception cref="System.ArgumentOutOfRangeException">
        /// 渡された<paramref name="index"/>が格納されているセッション値の範囲を超えている場合にスローします。
        /// </exception>
        public static object Takeout(this HttpSessionState self, int index) {
            return Takeout(self, index, true);
        }

        /// <summary>
        /// セッション値を取得し、そのセッション値を削除します。
        /// </summary>
        /// <param name="self">HttpSessionStateのインスタンス。</param>
        /// <param name="index">セッション値の数値インデックス。</param>
        /// <param name="ThrowExceptionIfNotContains">
        /// セッション値が保持されていない場合に例外をスローする場合はtrue。スローしない場合はfalse。
        /// </param>
        /// <returns>取得したセッション値。</returns>
        public static object Takeout(this HttpSessionState self, int index, bool throwExceptionIfNotContains) {
            object o = self[index];
            if((o == null) && throwExceptionIfNotContains) {
                throw new ArgumentOutOfRangeException("index", "渡されたIndexは格納されているセッション値の範囲を超えています。");
            }
            self.RemoveAt(index);
            return o;
        }

        /// <summary>
        /// セッション値を取得し、そのセッション値を削除します。
        /// </summary>
        /// <param name="self">HttpSessionStateのインスタンス。</param>
        /// <param name="index">セッション値のキー名。</param>
        /// <param name="ThrowExceptionIfNotContains">
        /// セッション値が保持されていない場合に例外をスローする場合はtrue。nullを取得する場合はfalse。
        /// </param>
        /// <returns>取得したセッション値。</returns>
        /// <exception cref="System.InvalidOperationException">
        /// 渡されたキー名のセッション値が格納されていない場合にスローします。
        /// </exception>
        public static object Takeout(this HttpSessionState self, string name) {
            return Takeout(self, name, true);
        }

        /// <summary>
        /// セッション値を取得し、そのセッション値を削除します。
        /// </summary>
        /// <param name="self">HttpSessionStateのインスタンス。</param>
        /// <param name="index">セッション値のキー名。</param>
        /// <param name="ThrowExceptionIfNotContains">
        /// セッション値が保持されていない場合に例外をスローする場合はtrue。nullを取得する場合はfalse。
        /// </param>
        /// <returns>取得したセッション値。</returns>
        public static object Takeout(this HttpSessionState self, string name, bool throwExceptionIfNotContains) {
            object o = self[name];
            if((o == null) && throwExceptionIfNotContains) {
                throw new InvalidOperationException("渡されたキー名のセッション値は格納されていません。");
            }
            self.Remove(name);
            return o;
        }

        #endregion HttpSessionState

    }
}