どういうこと?
Session値を一時的なデーター渡しに使う場合、値を取得直後に削除したい場合があります。でもSystem.Web.SessionState.HttpSessionStateクラスにはそのようなメソッドは用意されていません。そこで拡張メソッドを使い実装してみます。
どうすれば?
ソースコードを晒します。
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> public static object Takeout(this HttpSessionState self, int index) { object o = self[index]; if(o == null) { throw new ArgumentOutOfRangeException("index", "渡されたIndexは格納されているセッション値の範囲を超えています。"); } self.RemoveAt(index); return o; } /// <summary> /// セッション値を取得し、そのセッション値を削除します。 /// </summary> /// <param name="self">HttpSessionStateのインスタンス。</param> /// <param name="index">セッション値のキー名。</param> /// <returns>取得したセッション値。</returns> public static object Takeout(this HttpSessionState self, string name) { object o = self[name]; if(o == null) { throw new InvalidOperationException("渡されたキー名のセッション値は格納されていません。"); } self.Remove(name); return o; } #endregion HttpSessionState } }
課題は?
型パラメータを渡してキャストした値を返却したかったができませんでした。クラスへのキャストはできたのですが、値型にキャストするとき(例えばintの場合は"(int) object"と記述すると)、例外が発生してしまいます。