2012-10-07 2 views
2

Я хочу сделать что-то вроде следующего в C#:Как проверить, является ли переменная переменной типа в C#?

public bool ValidType(Type type) 
{ 
    return _someVar is type; 
} 

C#, кажется, не поддерживает этот синтаксис, хотя; элемент справа от «is», по-видимому, должен быть абсолютным типом, а не ссылкой на тип.

Я обнаружил, что следующий код, кажется, работает:

return _someVar.GetType().IsInstanceOfType(type) || 
    _someVar.GetType().IsSubclassOf(type) || 
    _SomeVar.GetType().IsAssignableFrom(type); 

Я не понимаю, что IsAssignableFrom делает, кроме того, что, кажется, нужно в некоторых сравнений типа как IsInstanceOfType и IsSubclassOf, кажется, не совпадают все случаи должным образом.

Действительно ли это лучший способ проверить переменную типа, называемого другой переменной, или есть более простой синтаксис, который я пропустил?

+0

всегда есть оператор 'typeof', а ключевое слово' as' –

+0

Спасибо за редактирование Тим :) –

+0

@ Dan-o, «as» имеет ту же проблему, что и «есть», поскольку он может использоваться только с именами типов. typeof() не покажет, является ли _someVar экземпляром типа производного типа. –

ответ

4

IsAssignableFrom достаточно, нет необходимости в двух других тестах, но вы называете это неправильным способом. Вот правильный способ:

public bool ValidType(Type type) 
{ 
    return type.IsAssignableFrom(_someVar.GetType()); 
} 

Я не понимаю, что IsAssignableFrom делает

На самом деле, это именно то, что название говорит вам: он проверяет, является ли назначаемый переменная данного типа от значения другого типа.

+0

Извините, но это просто неправда, мне нужны другие. IsAssignableFrom возвращает только true, если «type» - тип _someVar. Если это родительский тип _someVar, он возвращает false. Мне нужна такая же функциональность, как и «is», которая также работает и для родительских типов. –

+0

@ Давид Ах, вам нужно инвертировать аргументы! –

+0

А, я должен был внимательно посмотреть на ваш код. Я не думал делать type.IsAssignableFrom(), я делал _someVar.IsAssignableFrom(). Это действительно делает то, что мне нужно. Огромное спасибо. –

1

Как Конрад упомянул IsAssignableFrom, достаточно для вашего теста.

Определяет, можно ли назначить экземпляр текущего типа из экземпляра указанного типа.

http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx

Вам не нужны другие две проверки, потому что в тех случаях, IsAssignableFrom также будет правдой.

Смежные вопросы