【问题标题】:"is" - operator for Type"is" - 类型运算符
【发布时间】:2011-09-18 19:10:01
【问题描述】:

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

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

这很好用,尤其是当它找到任何继承自 ScreenBase 但不继承自 ScreenBase 的基类的类时。

当我只知道类型并且不想实例化类时,我也想这样做:

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

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

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

【问题讨论】:

    标签: c# .net types typeof


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      如果您想具体了解它是否从类型派生,请使用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...
      }
      

      【讨论】:

        【解决方案3】:

        您正在寻找Type.IsAssignableFrom

        【讨论】:

          猜你喜欢
          • 2016-06-25
          • 1970-01-01
          • 2015-10-29
          • 2022-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-21
          • 1970-01-01
          相关资源
          最近更新 更多