こちらの続きです。
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");
こんなにスマートになりました。