2013-07-24 14 views
14

Sto cercando di trovare un'alternativa a quanto segue in modo da poter sfruttare l'operatore is.C'è un modo per passare un argomento all'operatore is?

public bool IsOfType(Type type) 
{ 
    return this._item.GetType() == type; 
} 

Qualcosa di simile al seguente, che non viene compilato.

public bool IsOfType(Type type) 
{ 
    return this._item is type; 
} 

risposta

28

Penso che tu sia alla ricerca di Type.IsAssignableFrom:

public bool IsOfType(Type type) 
{ 
    return _item != null && type.IsAssignableFrom(_item.GetType()); 
} 

Oppure, se si può fare il metodo generico, che è più semplice, come si possibile uso is con un parametro di tipo:

public bool IsOfType<T>() 
{ 
    return _item is T; 
} 

MODIFICA: come indicato nella risposta di Wim, c'è anche Type.IsInstanceOf che rende la meth non generica od semplice:

public bool IsOfType(Type type) 
{ 
    return type.InstanceOf(_item); 
} 
+2

Mi hanno picchiato a esso;) –

+1

Quasi per pubblicare il generici alternativa ... Perché ho dovuto vedere la risposta aggiornato? :) –

+1

Non ho mai apprezzato la sintassi InstanceOf, vale quasi la pena di fare questo metodo di estensione su 'object' solo per evitarlo. – demoncodemonkey

12

Si possono fare cose diverse, a seconda del contesto:

  • Usa Type.IsAssignableFrom(Type) se tutto quello che hai è di due-tipo istanze.
  • Utilizzare Type.IsInstanceOf(object instance) se si ha accesso a un'istanza da confrontare.
  • Utilizzare farmaci generici come:

    public bool IsOfType<T>() 
    { 
        return this._item is T; 
    } 
    
+2

Mi ero dimenticato di Type.IsInstanceOf. Doh! Modifica la mia risposta con un esempio completo di questo ... –

+0

In realtà si chiama 'IsInstanceOfType', non solo' IsInstanceOf'. –

Problemi correlati