2009-07-03 6 views
1

HttpContext.Current.Request와 HttpContext.Current.Session을 하나의 클래스로 묶고 싶습니다.클래스와 같은 두 개의 dict을 가져 와서 함께 묶으려면 어떻게해야합니까?

기본적으로 나는 col [ "key"]라고 쓰고 싶습니다. 그리고 이들 중 하나를 키에 대해 확인하고 다른 키를 확인하기 위해 존재하지 않는 경우.

AFAIK 인터페이스를 공유하지 않습니다 ("Go To Definition"을 사용하여 주변을 둘러 보았지만 꽤 나빴습니다). 어떻게 이러한 유형을 매개 변수로 사용할 수있는 클래스를 작성합니까? 나는 인터페이스를 쓰려고했지만 그 클래스는 그 클래스로부터 상속받지 못하기 때문에 그 일은하지 않았다. 나는 객체 o = request를 할당하려고 시도했다. 다음 개체를 작성 o2 = o [ "키"]; 하지만 그로 인해 컴파일 오류가 발생했습니다.

나는 쉽게 할 수있는 긍정적이지만 어떻게 될지 모르겠다.

답변

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

좋은 해결책. 나는 아마도 Get보다 더 나은 메소드 이름을 생각하려고 시도 할 것이다! – 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; 
    } 
} 

이것은 실제로 대답이 아니며 단지 관찰 일뿐입니다. 코드 샘플이 포함되어 있으므로 주석으로 사용하지 않았습니다.

관련 문제