Ответы:
Разные ответы здесь имеют два разных значения.
Если вы хотите проверить, является ли экземпляр точного типа, то
if (c.GetType() == typeof(TForm))
это путь
Если вы хотите знать, cявляется ли это экземпляр TForm или подкласс, используйте is/ as:
if (c is TForm)
или
TForm form = c as TForm;
if (form != null)
Стоит уяснить, какое из этих действий вы на самом деле хотите.
isи asс сопоставлением с образцом:if (x is TForm tf) {…
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
Проверяет, совместим ли объект с данным типом. Например, это может быть определено, совместим ли объект с строковым типом как это:
Также несколько в том же духе
Type.IsAssignableFrom(Type c)
"Истинно, если c и текущий тип представляют один и тот же тип, или если текущий тип находится в иерархии наследования c, или если текущий тип является интерфейсом, который реализует c, или если c является параметром универсального типа и текущим типом представляет собой одно из ограничений c. "
Отсюда: http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx
typeof(Class).IsAssignableFrom(object.getType())похож на instanceofоператор Java .
T1.IsAssignableFrom(T2)возвращать trueв ситуациях, когда asоператор возвращает ненулевое значение, учитывая экземпляры этих типов.
Немного более компактный, чем другие ответы, если вы хотите использовать c в качестве TForm:
if(c is TForm form){
form.DoStuff();
}
Как уже упоминалось, ключевое слово «есть». Однако, если вы собираетесь позже привести его к этому типу, например.
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);
==). В объектных или ориентированных языках, поддерживающих наследование, если вы не знаете, что ваш конкретный тип никогда не будет наследоваться, например, от sealedкласса. Также: меня беспокоит использование троичного оператора, возвращающего (статические / постоянные) логические значения, я был бы менее обеспокоен, если бы это было switchутверждение.
instanceofи C #is- намного лучшие способы сделать это.