以下のエントリーを改良してみます。
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 } }