Architect's Log

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

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

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

以下の課題を解決できました。

型パラメータを渡してキャストした値を返却したかったができませんでした。クラスへのキャストはできたのですが、値型にキャストするとき(例えばintの場合は"(int) object"と記述すると)、例外が発生してしまいます。

どうやって?

ソースコードを記載します。

using System;
using System.Web.SessionState;

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

どうなった?

int i = int.Parse(Session.Takeout("hoge").ToString());

このメソッド呼び出しが、

int i = Session.Takeout<int>("hoge");

こんなにスマートになりました。