2012-03-06 10 views
1

ウェブフォームPageが特定のタイプであるかどうかを試しています。Pageがカスタムクラスのタイプである場合

私は互いを継承する基底クラスの数持っている:カスタムUserControl

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

を、私はページを取得する必要があり、それはCMSPageから派生している場合のみ。

私が試した:

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

しかしメソッドGetType(の値)だけでページのクラス名を返します。私がする必要があるように見えます:

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

マッチを働かせるには。ただし、一部のページはレベルにあり、タイプはCMSPageに達しています。

それは正しいものを見つけるまで、私は、各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

かの理由は、私の最後の1は私のお気に入りであることそれを使って何かしたいと思っていました。私はすでに強く型付けされた参照を用意しています。 – n8wrl

+0

提案をありがとう。私は 'page is MyPageType'と' MyPageType myPage = page as MyPageType'を試しましたが、 'MyPageType'から派生していないページでさえ、' myPage'を 'null'ではなく返していました。 'if(type of(CMSPage).IsAssignableFrom(Page.GetType()))'が扱われました!私はちょうどこれを渡って来た: 'if(Page.IsPageTypeOf(typeof(CMSPage)))'両方ともうまくいくかどうか分からない。 –

+1

@Scrooby:あなたは間違ったことをしています。確かにasはうまくいくからです。適切な型ではないオブジェクトへの参照に対してnull以外の結果を与えることはできません。型の安全性に違反します。 –

関連する問題