![](/img/trans.png)
[英]How can I get the CheckBoxList selected values, what I have doesn't seem to work C#.NET/VisualWebPart
[英]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.