这是我在这里提出的第一个问题,所以我希望我能够很好地表达出来,并希望它不会太麻烦。
我有以下类 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库获取正确的类型吗?或者是否有可以重新定义以返回主类的覆盖?
提前谢谢
答案 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));
不像我希望的那样干净,或者像你的答案那样直截了当。无论如何,谢谢大家的答案。它们的简单性让我意识到我需要学习很多东西。