Architect's Log

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

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

どういうこと?

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"と記述すると)、例外が発生してしまいます。