Проверьте, имеет ли экземпляр тип
Используя это, чтобы проверить, если 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
Как уже упоминалось, ключевое слово "есть". Однако, если вы собираетесь позже привести его к этому типу, например.
TForm t = (TForm)c;
Тогда вы должны использовать ключевое слово "как".
например TForm t = c as TForm.
Тогда вы можете проверить
if(t != null)
{
// put TForm specific stuff here
}
Не объединяйте, как с, потому что это дубликат проверки.
bool isValid = c.GetType() == typeof(TForm) ? true : false;
или проще
bool isValid = c.GetType() == typeof(TForm);