2009-07-03 2 views
1

HttpContext.Current.RequestとHttpContext.Current.Sessionを1つのクラスにまとめたいと思います。私はどのようにクラスのような2つのdictを取って一緒にラップするのですか?

基本的に私はcol ["key"]と書いています。これらのキーのうちの1つをチェックして、それを確認するキーがない場合はチェックします。

AFAIK彼らはインターフェイスを共有しません(私は「Go To Definition」を使って見ていますが、かなり悪いです)。私はどのようにこれらの型を両方のパラメータとして取ることができるクラスを書くだろうか?私はインターフェイスを作成しようとしましたが、クラスはそれらから継承しないので、その作業はありませんでした。私はo = requestというオブジェクトを割り当てようとしました。 o2 = o ["key"]オブジェクトを書く。コンパイルエラーも発生しました。

私はこれは簡単に行うことができますが、私はどのように考えていない肯定的です。

答えて

2
public class RequestOrSession 
{ 
    public object this[string key] 
    { 
     get 
     { 
      HttpContext context = HttpContext.Current; 
      if (context == null) 
      { 
       throw new InvalidOperationException("Where's the HttpContext?"); 
      } 

      // if the same key exists in Request and Session 
      // then Request will currently be given priority 
      return context.Request[key] ?? context.Session[key]; 
     } 
    } 
} 
+0

downvotersはコメントを残したいですか?これは正確にOPが求めているものではありませんか? – LukeH

+1

彼らはちょうど嫉妬深いです。 :) – Groo

4

エクステンション方式はどうですか?例:

public static object Get(this HttpContext context, string key) 
{ 
    return context.Request[key] ?? context.Session[key]; 
} 

今、あなたはこの

HttpContext.Current.Get(key); 
+0

良い解決策。私はおそらく、より良いメソッド名を考えようとするだろう! – RichardOD

2

のようにそれを使用することができますHttpRequestのこれを行いインデクサを持っていますが、セッション - のために、それは(リフレクタからのコード)しかし遅いません:

public string this[string key] 
{ 
    get 
    { 
     string str = this.QueryString[key]; 
     if (str != null) 
     { 
      return str; 
     } 
     str = this.Form[key]; 
     if (str != null) 
     { 
      return str; 
     } 
     HttpCookie cookie = this.Cookies[key]; 
     if (cookie != null) 
     { 
      return cookie.Value; 
     } 
     str = this.ServerVariables[key]; 
     if (str != null) 
     { 
      return str; 
     } 
     return null; 
    } 
} 

これは本当に答えではなく、ただの観察です。コードサンプルが含まれているので、私はコメントとしてそれを置かなかった。

関連する問題