Проверьте, имеет ли экземпляр тип

Используя это, чтобы проверить, если c это пример TForm,

c.GetType().Name.CompareTo("TForm") == 0

Есть ли более безопасный способ сделать это, кроме использования string в качестве параметра к CompareTo()?

9 ответов

Решение

Разные ответы здесь имеют два разных значения.

Если вы хотите проверить, является ли экземпляр точного типа, то

if (c.GetType() == typeof(TForm))

это путь

Если вы хотите знать, c это пример TForm или подкласс затем использовать is/as:

if (c is TForm)

или же

TForm form = c as TForm;
if (form != null)

Стоит уяснить, какое из этих действий вы на самом деле хотите.

if(c is TFrom)
{
   // Do Stuff
}

или если вы планируете использовать c как TFormиспользуйте следующий пример:

var tForm = c as TForm;
if(tForm != null)
{
   // c is of type TForm
}

Во втором примере нужно только проверить, c имеет тип TForm один раз. Где, если вы проверите, если посмотреть, если c имеет тип TForm затем разыграйте, CLR подвергается дополнительной проверке. Вот ссылка.

Редактировать: Украдено у Джона Скита

Если вы хотите убедиться, c имеет TForm а не любой класс, наследующий от TFormзатем используйте

if(c.GetType() == typeof(TForm))
{
   // Do stuff cause c is of type TForm and nothing else
}

Да, ключевое слово "is":

if (c is TForm)
{
    ...
}

Подробности смотрите в MSDN: http://msdn.microsoft.com/en-us/library/scekt9xw(VS.80).aspx

Проверяет, совместим ли объект с данным типом. Например, это может быть определено, совместим ли объект с строковым типом как это:

Немного более компактный, чем другие ответы, если вы хотите использовать c в качестве TForm:

if(c is TForm form){
    form.DoStuff();
}

Также несколько в том же духе

Type.IsAssignableFrom(Type c)

"True, если c и текущий тип представляют один и тот же тип, или если текущий тип находится в иерархии наследования c, или если текущий тип является интерфейсом, который реализует c, или если c является параметром универсального типа и текущим типом представляет собой одно из ограничений c."

Отсюда: http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx

Попробуйте следующее

if (c is TForm) { 
 ...
}

Как уже упоминалось, ключевое слово "есть". Однако, если вы собираетесь позже привести его к этому типу, например.

TForm t = (TForm)c;

Тогда вы должны использовать ключевое слово "как".

например TForm t = c as TForm.

Тогда вы можете проверить

if(t != null)
{
 // put TForm specific stuff here
}

Не объединяйте, как с, потому что это дубликат проверки.

Или же

c.getType() == typeOf(TForm)
bool isValid = c.GetType() == typeof(TForm) ? true : false;

или проще

bool isValid = c.GetType() == typeof(TForm);
Другие вопросы по тегам