2008-10-14 23 views
6

Tôi muốn có một loại đối tượng "BasePage" mà tôi đang tạo. Mỗi đối tượng Trang dựa trên BasePage. Ví dụ, tôi có một Login.aspx và trong code-behind của tôi và một lớp học có một phương pháp hiển thị:ASP.Net và GetType()

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

Trong cấu trúc dự án của tôi Tôi có một tập tin tài nguyên mặc định và một tập tin tài nguyên psuedo-dịch. Nếu tôi đặt thử một cái gì đó như thế này:

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

nó sẽ trả về trang đã dịch. Sau khi một số nghiên cứu tôi thấy rằng page.GetType(). ToString() trả về một cái gì đó để tác động của "ASP_login.aspx" Làm thế nào tôi có thể nhận được mã thực tế đằng sau loại lớp, như vậy mà tôi nhận được một đối tượng của loại "Đăng nhập" đó là bắt nguồn từ "BasePage"?

Cảm ơn trước!

Trả lời

6

Nếu mã bên cạnh của bạn trông như thế này:

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

Sau đó, bạn sẽ nhận được các đối tượng Type cho nó với typeof(_Login). Để có được loại động, bạn có thể tìm thấy nó một cách đệ quy:

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

Tùy thuộc vào nơi bạn đang gọi đến Display() từ. Nếu bạn đang gọi nó từ ASPX, sau đó bạn sẽ "ASP_login.aspx". Nếu bạn đang gọi nó từ mã phía sau (tức là phương thức Page_Load()), bạn sẽ nhận được loại trang Đăng nhập.

Thay vì chuyển Trang vào, bạn có thể xem xét chỉ sử dụng thuộc tính Trang (tức là this.Page.GetType()) phải luôn là loại trang/codebehind hiện tại, nếu tôi nhớ chính xác.

Tôi cũng nên làm cho điểm mà bạn có thể xem xét di chuyển loại công cụ này ra khỏi ASPX/codebehind và vào một số loại dịch vụ. Nó thường là một ý tưởng tốt để giảm thiểu số lượng những điều bạn làm trong một mã phía sau và, thay vào đó, đẩy logic vào một lớp trình bày và làm theo các mô hình MVP cho ASP.NET Web Forms phát triển.

3

Sau khi một số nghiên cứu thêm Tôi thấy rằng nếu tôi gọi Page.GetType() BaseType nó sẽ trả về mã-đằng sau loại trang ASPX..

1

page.GetType(). BaseType, đã được nói trước đây, nhưng hãy để tôi giải thích tại sao.

trang ASPX kế thừa từ trang code-behind của họ, có nghĩa là hệ thống phân cấp thừa kế trông như thế này:

... 
Page 
BasePage 
Login 
ASP_Login 

đâu Trên cùng là phụ huynh và phía dưới là những đứa trẻ.

Điều này cho phép mã của bạn được truy cập từ trang aspx, mà không yêu cầu tất cả mã được tạo liên quan đến trang aspx thực tế của bạn sẽ được sao chép vào trang lớp cơ sở.

Các vấn đề liên quan