2010-02-19 13 views
18

que quiero hacer algo como estoUsando el operador `is` con los genéricos en C#

class SomeClass<T> 
{ 
    SomeClass() 
    { 
     bool IsInterface = T is ISomeInterface; 
    } 
} 

¿Cuál es la mejor manera de algo como esto?

Nota: No estoy tratando de restringir T con un , pero me gustaría que mi código tenga en cuenta qué tipos de interfaces implementa T. Preferiría que no tuviera que construir un T.

+11

Si usted está comprobando tipos en un método/clase genérica, la OMI algo está mal. – spender

+0

No quiero tener 3 descendientes separados de SomeClass. Quiero cierta clase para ciertas cosas dependiendo de si 'T' tiene algo. –

Respuesta

25

No creo que pueda usar el operador is para esto. Pero se puede usar IsAssignableFrom:

bool IsInterface = typeof(ISomeInterface).IsAssignableFrom(typeof(T)); 
1

Creo que lo mejor que puede hacerlo:

bool IsInterface = typeof(ISomeInterface).IsAssignableFrom(typeof(T)); 
7

debe utilizar siguiente en su lugar

bool IsInterface = typeof(ISomeInterface).IsAssignableFrom(typeof(T)); 

es el operador

El operadorse utiliza para verificar si el run-time type de un objeto es compatible con un type dado.

Una expresión donde el uso de is cumple con la sintaxis, como resultado true, si se cumplen ambos de los siguientes condiciones:

  • expresión no es nulo.
  • expresión se puede convertir a tipo. Que es, una expresión moldeada del formulario (tipo) (expresión) completará sin lanzar una excepción. Para más información, consulte 7.6.6 Cast expressions.

Referencias

0

Usted podría intentar hacer algo como

Type Ttype = typeof(T); 

Eso le dará toda la potencia de la clase Type, que tiene funciones como "FindInterfaces".

2

Puede utilizar IsAssignableFrom:

class SomeClass<T> 
    { 
    SomeClass() 
    { 
     bool IsIComparable = typeof(IComparable).IsAssignableFrom(typeof(T)); 
    } 
    } 
2
bool IsInterface = typeof(ISomeInterface).IsAssignableFrom(typeof(T))