2008-10-14 6 views
6

내가 만들고있는 "BasePage"개체 유형을 가져오고 싶습니다. 모든 페이지 개체는 BasePage를 기반으로합니다. 예를 들어, 나는 Login.aspx이 내 코드 숨김 및 방법 표시가있는 클래스 : 내 프로젝트 구조에서ASP.Net 및 GetType()

Display(BasePage page) { 
    ResourceManager manager = new ResourceManager(page.GetType()); 
} 

나는 기본 리소스 파일과 사이비 번역 자원 파일이 있습니다. 만약 내가 이런 식으로 시도하면 :

Display(BasePage page) { 
    ResourceManager manager = new ResourceManager(typeof(Login)); 
} 

번역 된 페이지를 반환합니다. 일부 연구 후 나는 page.GetType(). ToString()이 "ASP_login.aspx"의 효과에 뭔가를 반환했다는 것을 알았습니다. "Login"유형의 객체를 얻을 수 있도록 클래스 유형 뒤에 실제 코드를 어떻게 얻을 수 있습니까? "BasePage"에서 파생 되었습니까?

미리 감사드립니다.

답변

6

이 코드는-옆에 같이 보입니다 경우

public partial class _Login : BasePage 
{ /* ... */ 
} 

는 그런 다음 typeof(_Login)와의 Type 객체를 얻을 것입니다. 동적 유형을 얻으려면, 당신은 재귀 적으로 찾을 수 있습니다 :

Type GetCodeBehindType() 
{ return getCodeBehindTypeRecursive(this.GetType()); 
} 

Type getCodeBehindTypeRecursive(Type t) 
{ var baseType = t.BaseType; 
    if (baseType == typeof(BasePage)) return t; 
    else return getCodeBehindTypeRecursive(baseType); 
} 
0

어디에서 표시()를 호출하는지에 따라 다릅니다. ASPX에서 호출하는 경우 "ASP_login.aspx"가됩니다. 코드 숨김 (예 : Page_Load() 메소드)에서 호출하는 경우 로그인 페이지 유형을 가져야합니다.

페이지를 전달하는 대신 페이지 속성 (즉, this.Page.GetType())을 사용하는 것을 고려해 볼 수 있습니다. 올바르게 호출 한 경우 항상 현재 페이지/코드 숨김 유형이어야합니다.

나는 또한 ASPX/코드 숨김 및 서비스의 일종으로 이런 종류의 물건을 옮길 것을 고려해야 할 지점을 만들어야합니다. 일반적으로 코드에서 수행하는 작업의 양을 최소화하고 대신 논리를 발표자 클래스로 푸시하고 ASP.NET Web Forms 개발의 MVP 패턴을 따르는 것이 좋습니다.

3

을 내가 Page.GetType를 호출하는 경우() baseType 여기서이 코드 숨김 영문 페이지의 형식을 반환하는 것을 발견 몇 가지 추가 조사 후..

1

page.GetType(). BaseType은 이전에 언급되었지만 그 이유에 대해 자세히 설명합니다.

영문 페이지는 상속 계층 구조는 다음과 같습니다 의미, 자신의 코드 숨김 페이지에서 상속 : 상단은 부모와 바닥이 자식

... 
Page 
BasePage 
Login 
ASP_Login 

.

이렇게하면 실제 aspx 페이지와 관련된 생성 된 코드를 모두 기본 클래스 페이지에 복사하지 않고도 aspx 페이지에서 코드에 액세스 할 수 있습니다.