C#.NET – 如何让typeof()与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 

编辑:这回答了主题标题中的问题。 如完整post中所述, cdm9002可以更好地解决问题。

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

这看起来像是一个多态性的工作,而不是一个带有特定类测试的大型switch语句。

作为(c is B)检查的替代方法,您还可以执行以下操作:

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

在某些情况下这是首选,因为为了在使用时使用c作为B ,无论如何都必须进行投射。

对于使用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”类型,因此您需要使用reflection而不是“is”运算符。

我使用Sam的解决方案,当Resharper提出这个建议时,我感到非常惊讶。