2012-03-06 59 views
1

我正在試圖弄清楚我的webforms Page是否是某種類型。如果頁面是typeof自定義類

我有一些基類繼承彼此:

BasePage -> System.Web.UI.Page 
CMSPage -> BasePage 
Page -> CMSPage 

在自定義UserControl,我需要的頁面,但只有當它是從CMSPage的。

我已經試過:

if(Page.GetType() == typeof(CMSPage)) 

但將gettype()的值只返回頁面的類名。它看起來像我需要做的:

if(Page.GetType().BaseType.BaseType == typeof(CMSPage)) 

爲了得到匹配的工作。但是,有些頁面在達到CMSPage的類型之前處於不同的BaseType級別。

我可以通過每個BaseType創建這樣循環的功能,直到它找到合適的一個:

public static bool IsPageTypeOf(this System.Web.UI.Page page, Type targetType) 
{ 
    var pageType = page.GetType(); 
    if (pageType == targetType) 
     return true; 
    while (pageType.BaseType != null) 
    { 
     if (pageType.BaseType == targetType) 
      return true; 
     pageType = pageType.BaseType; 
    } 
    return false; 
} 

但感覺凌亂。有一個更好的方法嗎?

回答

7

你是否在尋找:

return targetType.IsAssignableFrom(page.GetType()); 

或者,如果你知道在編譯時的類型:

if (page is MyPageType) 

或者:

MyPageType myPage = page as MyPageType; 
if (myPage != null) 
{ 
    // Use myPage 
} 
+1

這最後一個是我最喜歡的,因爲如果我想用它做點什麼我已經準備好了一個強類型的參考 – n8wrl 2012-03-06 22:15:02

+0

感謝您的建議。我試過'頁面是MyPageType'和'MyPageType myPage =頁面是MyPageType',但是它不斷地返回'myPage'不是'null',即使在不是從'MyPageType'派生的頁面上。 'if(typeof(CMSPage).IsAssignableFrom(Page.GetType()))'雖然有效!我也遇到過這樣的情況:'if(Page.IsPageTypeOf(typeof(CMSPage)))'既可以工作,也不確定它們之間是否有很大的區別。 – 2012-03-06 22:21:11

+1

@史密斯:那麼你有什麼不對,因爲'當然*將*工作。它不可能給一個非正確類型的對象引用非空結果 - 這會違反類型安全性。 – 2012-03-06 22:24:52