2008-10-24 22 views
13

¿Cómo obtengo el tipo de clase genérica dentro de la clase?.NET: ¿Cómo verificar el tipo dentro de una clase genérica?

Un ejemplo:

que construir una colección con tipo genérico implementar ICollection < T>. Dentro Tengo métodos como

public void Add(T item){ 
     ... 
    } 

    public void Add(IEnumerable<T> enumItems){ 
     ... 
    } 

¿Cómo puedo pedir dentro del método para el tipo dado T?

El motivo de mi pregunta es: Si se utiliza objeto como T la colección utiliza Añadir (tema objeto) en lugar de Agregar (IEnumerable < object> enumItems) incluso si el parámetro es IEnumerable. Entonces, en el primer caso agregaría toda la colección enumerable como un objeto en lugar de múltiples objetos de la colección enumerable.

así que necesito algo así como

if (T is object) { 
    // Check for IEnumerable 
} 

pero por supuesto que no se puede trabajar en C#. Sugerencias?

¡Muchas gracias!

Michael

Respuesta

21

Personalmente, sería un Lado el problema cambiando el nombre del método IEnumerable<T> a AddRange. Esto evita estos problemas y es coherente con las API existentes, como List<T>.AddRange.

También mantiene las cosas limpias cuando el T que desea agregar implementa IEnumerable<T> (raro, lo admitiré).

29

Usted puede utilizar: typeof(T)

if (typeof(T) == typeof(object)) { 
    // Check for IEnumerable 
} 
+2

esto responde a la pregunta planteada en el título. – reads0520

-1

Si desea utilizar el operador is en una clase/método genérico que tiene que limitar T a un tipo de referencia:

public void MyMethod<T>(T theItem) where T : class 
{ 
    if (theItem is IEnumerable) { DoStuff(); } 
} 
+0

Creo que está preocupado cuando un IEnumerable no genérico se pasa como un System.Object cuando T es System.Object –

+0

marxidad, sí, eso es correcto. – Mil

Cuestiones relacionadas