2013-07-24 10 views
14

Próbuję znaleźć alternatywę dla poniższych, aby móc skorzystać z operatora is.Czy istnieje sposób przekazania argumentu do operatora is?

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

Coś podobnego do następującego, które się nie kompiluje.

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

Odpowiedz

28

myślę szukasz Type.IsAssignableFrom:

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

Albo czy można zrobić metoda rodzajowa, to prostsze jak może użycie is z parametrem typu:

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

EDYCJA: Jak zauważono w odpowiedzi Wima, istnieje również Type.IsInstanceOf, który sprawia, że ​​nie generyczny met od prostsze:

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

Pobiłeś mnie do niego;) –

+1

Prawie odpowiedzieć alternatywę rodzajowych ... Dlaczego musiałem zobaczyć zaktualizowaną odpowiedź? :) –

+1

Zawsze nie lubiłem składni InstanceOf, prawie warto zrobić z tego metodę rozszerzenia na 'obiekcie', aby tego uniknąć. – demoncodemonkey

12

Można zrobić wiele rzeczy, w zależności od kontekstu:

  • Zastosowanie Type.IsAssignableFrom(Type) jeśli wszystko masz to dwa rodzaje-instancje.
  • Użyj Type.IsInstanceOf(object instance), jeśli masz dostęp do instancji do porównania.
  • Użyj generyczne jak:

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

Zapomniałem o Type.IsInstanceOf. Doh! Zmienię moją odpowiedź z pełnym przykładem tego ... –

+0

To tak naprawdę nazywa się 'IsInstanceOfType', a nie tylko' IsInstanceOf'. –

Powiązane problemy