«is» - оператор для типа - PullRequest
       24

«is» - оператор для типа

6 голосов
/ 18 сентября 2011

Я использую оператор "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)

Но это сравнение выдает предупреждение, поскольку оно будет сравниваться с "типом"class.

Единственная известная мне альтернатива - сравнивать с == typeof, но это будет проверять только точный тип, а не унаследованные.Есть ли способ получить подобное поведение, например, оператор "is", но для типа, описанного в классе Type?

Ответы [ 3 ]

11 голосов
/ 18 сентября 2011

Единственная альтернатива, которую я знаю, это сравнивать с == typeof, но это будет проверять только точный тип, а не унаследованные. Есть ли способ получить подобное поведение, например, оператор "is", но для типа, описанного в классе Type?

Если GetType(line) возвращает тип (я бы рекомендовал более подходящее имя для этого, кстати), вы можете использовать Type.IsAssignableFrom :

if (typeof(ScreenBase).IsAssignableFrom(GetType(line)))
{
}
5 голосов
/ 18 сентября 2011

Если вы хотите точно знать, происходит ли оно от типа, используйте 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 голосов
/ 18 сентября 2011

вы ищете Type.IsAssignableFrom

...