“是” - 类型的运算符

时间:2011-09-18 19:10:01

标签: c# .net types typeof

我使用“is”运算符来查找某个类:

for(int i=0; i<screens.Count; i++){
  if(screen is ScreenBase){
    //do something...
  }
}

这很好用,特别是当它找到任何继承自ScreenBase的类而不是ScreenBase的基类时。

当我只知道Type并且不想实例化类时,我想做同样的事情:

Type screenType = GetType(line);
if (screenType is ScreenBase)

但是这个比较会产生一个警告,因为它会与“类型”类进行比较。

我知道的唯一选择是与== typeof进行比较,但这只会测试确切的类型而不是继承的类型。 有没有办法获得类似“is”运算符的类似行为,但对于Type-class描述的类型?

3 个答案:

答案 0 :(得分:11)

  

我知道的唯一选择是与== typeof进行比较,但这只会测试确切的类型而不是继承的类型。有没有办法获得类似“is”运算符的类似行为,但对于Type-class描述的类型?

如果GetType(line)返回某个类型(我建议使用更好的名称,顺便说一句),您可以使用Type.IsAssignableFrom

if (typeof(ScreenBase).IsAssignableFrom(GetType(line)))
{
}

答案 1 :(得分:5)

如果您想具体了解它是否来自该类型,请使用Type.IsSubclassOf()。这个不会用于接口。

Type screenType = GetType(line);
if (screenType.IsSubclassOf(typeof(ScreenBase)))
{
    // do stuff...
}

否则,如果您想知道该类型是否可以分配给某种类型的变量,请使用Type.IsAssignableFrom()用于接口。

Type screenType = GetType(line);
if (typeof(ScreenBase).IsAssignableFrom(screenType)) // note the usage is reversed
{
    // do stuff...
}

请注意,您不一定需要类型对象来确定这一点,您可以使用Type.IsInstanceOfType()对象的实例执行此操作。它的行为或多或少类似于IsAssignableFrom()

if (typeof(ScreenBase).IsInstanceOfType(line)) // note the usage is reversed
{
    // do stuff...
}

答案 2 :(得分:2)

您正在寻找Type.IsAssignableFrom