2012-03-06 28 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