2008-10-14 73 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 
{ /* ... */ 
} 

然後你會得到Type對象將其與typeof(_Login)。動態獲取的類型,你可以遞歸找到它:

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

這取決於你從哪裏調用Display()。如果你從ASPX調用它,那麼你將會是「ASP_login.aspx」。如果您是從代碼隱藏(即Page_Load()方法)調用它,您應該獲得登錄頁面類型。

而不是傳遞頁面,你可能會考慮只使用Page屬性(即this.Page.GetType())應該始終是當前頁面/代碼隱藏類型,如果我記得正確。

我還應該指出,您可能會考慮將這類內容從ASPX /代碼隱藏轉移到某種服務中。在代碼背後儘量減少事物的數量通常是一個好主意,相反,將邏輯推入演示者類並遵循ASP.NET Web窗體開發的MVP模式。

3

經過一些額外的研究,我發現,如果我叫Page.GetType()BASETYPE它返回的代碼隱藏式ASPX頁面的。

1

page.GetType()。BaseType,之前已經說過了,但讓我詳細說明原因。

ASPX頁面從他們的代碼隱藏頁繼承,這意味着繼承層次是這樣的:

... 
Page 
BasePage 
Login 
ASP_Login 

其中頂部是家長和底部是孩子。

這允許您的代碼隱藏在aspx頁面中,而不需要將與您的實際aspx頁面相關的所有生成代碼複製到基類頁面中。