基本类型的基本类型

11
这是我在这里的第一个问题,所以我希望我能够清楚地表达它,并且希望它不会太过简单。我有以下类 SubSim,它扩展了Sim,而Sim又扩展了MainSim。 在一个完全独立的类(以及库)中,我需要检查通过的对象是否是MainSim类型。 因此,以下操作用于检查
Type t = GetType(sim);
//在本例中,sim = SubSim
if (t != null)
{
  return t.BaseType == typeof(MainSim);
}
显然,由于Type.BaseType获取当前Type直接继承的类型,因此t.BaseType将返回Sim。 除了必须执行t.BaseType.BaseType以获取MainSub之外,是否有任何其他方式可以使用.NET库获取正确的类型? 或者是否有可以重新定义以返回主类的覆盖方法? 提前感谢您。
5个回答

20

有四种相关的标准方式:

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);
 }

我喜欢那个递归方法,我想我会尝试使用它来代替我的解决方案。谢谢! - Emmanuel F

10
if (sim is MainSim)

就是你所需要的。"is" 查找继承树。


2

1

'is'选项对我没用。它给了我一个警告:“给定的表达式从未是提供的('MainSim')类型”,但我相信这个警告更多地与我们所采用的框架有关。我的解决方案最终是:

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

不像我希望的那么简洁,也不像你们的答案那么直接。无论如何,感谢大家的回答。它们的简单性让我意识到我还有很多要学习。


你可能写成了"return t is MainSim"而不是"return sim is MainSim"。 - Hallgrim
最初我确实尝试过这样做,但我在问题中遗漏的是对象“sim”将是一个CollectionRow对象,而不一定是Sim对象本身,这就是为什么有调用Type t = GetType(sim)的原因。我尝试了其他几种方法,但否则它会返回false。 - Emmanuel F


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接