簡體   English   中英

C#.NET - 如何使用typeof()來繼承?

[英]C#.NET - How can I get typeof() to work with inheritance?

我將從代碼中解釋我的場景開始:

public class A { }

public class B : A { }

public class C : B { }

public class D { }

public class Test
{
    private A a = new A ( ) ;
    private B b = new B ( ) ;
    private C c = new C ( ) ;
    private D d = new D ( ) ;

    public Test ( )
    {
        // Evaluates to "false"
        if ( a.GetType == typeof(B) ) { } //TODO: Add Logic

        // Evaluates to "true"
        if ( b.GetType == typeof(B) ) { } //TODO: Add Logic

        // I WANT this to evaluate to "true"
        if ( c.GetType == typeof(B) ) { } //TODO: Add Logic

        // Evaluates to "false"
        if ( d.GetType == typeof(B) ) { } //TODO: Add Logic
    }
}

這里要注意的重要路線是:

if ( c.GetType == typeof(B) ) { }

我認為這實際上會評估為“假”,因為(B)類型和(C)類型在兩個方向上彼此不相等。 (C是B,但B不一定是C.)

但我需要的是某種將這一點考慮在內的條件。 如何判斷對象是B還是從中派生的任何東西?

我不在乎它是否是來自B的DERIVED對象,只要基類B類存在。 而且我無法預測派生類可能會在我的應用程序中顯示出來。 我只需要假設將來可能存在未知的派生類 - 因此我只能專注於確保基類是我所期望的。

我需要一個能夠為我執行此檢查的條件。 如何實現這一目標?

你可以使用is

if (c is B) // Will be true

if (d is B) // Will be false

編輯:這回答了主題標題中的問題。 cdm9002對問題有更好的答案,如完整帖子中所述。

typeof(B).IsAssignableFrom(c.GetType())

這看起來像是一個多態性的工作,而不是一個帶有特定類測試的大型switch語句。

作為(c is B)檢查的替代方法,您還可以執行以下操作:

var maybeB = c as B;
if (maybeB != null) {
   // make use of maybeB
}

因為為了利用這種優先在某些情況下c作為B使用的時候is ,你無論如何都會投。

對於使用Visual Studio 2008的VB.NET,您可以檢查它:

'MyTextBox control is inherited by Textbox
If Ctl.GetType.Name = "MyTextBox" then    

End If
typeof(B).IsInstanceOfType(c)

與sam-harwell的上述答案類似,有時您可能在變量中使用“B”類型,因此您需要使用反射而不是“is”運算符。

我使用Sam的解決方案,當Resharper提出這個建議時,我感到驚喜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM