Basetype的BaseType

时间:2008-10-21 14:21:06

标签: c#

这是我在这里提出的第一个问题,所以我希望我能够很好地表达出来,并希望它不会太麻烦。

我有以下类 SubSim ,它扩展了 Sim ,它正在扩展 MainSim 。在一个完全独立的类(和库)中,我需要检查传递的对象是否是一种 MainSim 。所以要做以下检查;

Type t = GetType(sim);
//in this case, sim = SubSim
if (t != null)
{
  return t.BaseType == typeof(MainSim);
}

显然 t.BaseType 将返回 Sim ,因为 Type.BaseType 获取当前Type直接继承的类型。

除了必须执行 t.BaseType.BaseType 以获取 MainSub 之外,还有其他方法可以使用.NET库获取正确的类型吗?或者是否有可以重新定义以返回主类的覆盖?

提前谢谢

5 个答案:

答案 0 :(得分:20)

有4种相关的标准方式:

sim is MainSim;
(sim as MainSim) != null;
sim.GetType().IsSubclassOf(typeof(MainSim));
typeof(MainSim).IsAssignableFrom(sim.GetType());

您还可以创建递归方法:

bool IsMainSimType(Type t)
 { if (t == typeof(MainSim)) return true;   
   if (t == typeof(object) ) return false;
   return IsMainSimType(t.BaseType);
 }

答案 1 :(得分:10)

if (sim is MainSim)

就是你所需要的。 “是”查找继承树。

答案 2 :(得分:1)

使用is keyword

return t is MainSim;

答案 3 :(得分:1)

答案 4 :(得分:1)

“是”选项对我不起作用。它给了我警告; “给定的表达式永远不会是提供的('MainSim')类型”,但我确实相信,警告更多地与我们现有的框架有关。我的解决方案最终成为:

return t.BaseType == typeof(MainSim) || t.BaseType.IsSubclassof(typeof(MainSim));

不像我希望的那样干净,或者像你的答案那样直截了当。无论如何,谢谢大家的答案。它们的简单性让我意识到我需要学习很多东西。