Risposte:
Le diverse risposte qui hanno due significati diversi.
Se vuoi verificare se un'istanza è di un tipo esatto allora
if (c.GetType() == typeof(TForm))
è la strada da percorrere.
Se vuoi sapere se cè un'istanza TForm o una sottoclasse, usa is/ as:
if (c is TForm)
o
TForm form = c as TForm;
if (form != null)
Vale la pena di essere chiaro nella mente su quale di questi comportamenti si desidera effettivamente.
ise abbinare i aspattern:if (x is TForm tf) {…
if(c is TFrom)
{
// Do Stuff
}
o se prevedi di utilizzarlo ccome a TForm, usa il seguente esempio:
var tForm = c as TForm;
if(tForm != null)
{
// c is of type TForm
}
Il secondo esempio deve solo verificare se cè di tipo TFormuna volta. Ovunque se controlli se vedi se cè di tipo, TFormquindi esegui il cast, il CLR viene sottoposto a un controllo aggiuntivo. Ecco un riferimento .
Modifica: rubato da Jon Skeet
Se vuoi assicurarti di cappartenere TForme non di alcuna classe che eredita TForm, allora usa
if(c.GetType() == typeof(TForm))
{
// Do stuff cause c is of type TForm and nothing else
}
Sì, la parola chiave "is":
if (c is TForm)
{
...
}
Vedi i dettagli su MSDN: http://msdn.microsoft.com/en-us/library/scekt9xw(VS.80).aspx
Verifica se un oggetto è compatibile con un determinato tipo. Ad esempio, è possibile determinare se un oggetto è compatibile con il tipo di stringa in questo modo:
Inoltre, un po 'nella stessa vena
Type.IsAssignableFrom(Type c)
"Vero se c e il Tipo corrente rappresentano lo stesso tipo, o se il Tipo corrente è nella gerarchia di ereditarietà di c, o se il Tipo corrente è un'interfaccia che c implementa, o se c è un parametro di tipo generico e il Tipo corrente rappresenta uno dei vincoli di c. "
Da qui: http://msdn.microsoft.com/en-us/library/system.type.isassignablefrom.aspx
typeof(Class).IsAssignableFrom(object.getType())simile instanceofall'operatore Java .
T1.IsAssignableFrom(T2)ritorna truein situazioni in cui l' asoperatore restituisce un valore non nullo, date le istanze di quei tipi.
Un po 'più compatto rispetto alle altre risposte se si desidera utilizzare c come TForm:
if(c is TForm form){
form.DoStuff();
}
Come altri hanno già detto, la parola chiave "è". Tuttavia, se in seguito lo proverai su quel tipo, ad es.
TForm t = (TForm)c;
Quindi dovresti usare la parola chiave "as".
per esempio TForm t = c as TForm.
Quindi puoi controllare
if(t != null)
{
// put TForm specific stuff here
}
Non combinare come è perché è un controllo duplicato.
bool isValid = c.GetType() == typeof(TForm) ? true : false;
o più semplice
bool isValid = c.GetType() == typeof(TForm);
==). In linguaggi oggetto o orientati che supportano l'ereditarietà a meno che non si sappia che il proprio Tipo specifico non verrà mai ereditato da una sealedClasse. Inoltre: l'uso di un operatore ternario che restituisce valori booleani (statici / costanti) mi dà fastidio, sarei meno infastidito se fosse switchun'affermazione.
instanceofe C #issono modi molto migliori per farlo.