2008-10-30 7 views
11

¿Hay alguna forma de determinar si un objeto es una lista genérica? No voy a saber el tipo de la lista, solo sé que es una lista. ¿Cómo puedo determinar eso?Si el objeto es Lista genérica

Respuesta

22

Esto devolverá "Verdadero"

List<int> myList = new List<int>(); 

Console.Write(myList.GetType().IsGenericType && myList is IEnumerable); 

qué te importa saber si es exactamente una "lista" o ... ¿estás bien con él que es IEnumerable, y genérico?

+0

Esto no se compila actualmente. https://dotnetfiddle.net/T0Q8w3. Tal vez lo hizo en '08. – sonicblis

+1

Hola @sonicblis, "IEnumerable" está en el espacio de nombres "System.Collections". No tenías 'using System.Collections;' en tu violín. Todavía compila en 2016 :) –

+0

@Timothy_Khouri, ah, lo tengo. Gracias por el puntero. – sonicblis

-1

Hay una función GetType() en la clase System.Object. ¿Has probado eso?

+0

Evento aunque tal vez esto no es una respuesta "perfecta", no puedo ver por qué se marca menos uno.Vamos chicos, no es la mejor respuesta posible, pero intentan no dañar la reputación de alguien. –

+0

GetType devolverá la lista genérica específica que es, a diferencia del hecho de que es solo una lista genérica. – Dested

2

Probar:

if(yourList.GetType().IsGenericType) 
{ 
    var genericTypeParams = yourList.GetType().GetGenericArguments; 
    //do something interesting with the types.. 
} 
7

El siguiente método devolverá el tipo de elemento de un tipo de colección genérico. Si el tipo no implementa ICollection <> se devuelve null.

static Type GetGenericCollectionItemType(Type type) 
{ 
    if (type.IsGenericType) 
    { 
     var args = type.GetGenericArguments(); 
     if (args.Length == 1 && 
      typeof(ICollection<>).MakeGenericType(args).IsAssignableFrom(type)) 
     { 
      return args[0]; 
     } 
    } 
    return null; 
} 

Editar: La solución anterior asume que el tipo especificado tiene un parámetro genérico de su propia. Esto no funcionará para los tipos que implementan ICollection <> con un parámetro genérico codificado, por ejemplo:

class PersonCollection : List<Person> {} 

Aquí es una nueva aplicación que se encargará de este caso.

static Type GetGenericCollectionItemType(Type type) 
{ 
    return type.GetInterfaces() 
     .Where(face => face.IsGenericType && 
         face.GetGenericTypeDefinition() == typeof(ICollection<>)) 
     .Select(face => face.GetGenericArguments()[0]) 
     .FirstOrDefault(); 
} 
0

La pregunta es ambigua.

La respuesta depende de lo que quiere decir con una lista genérica.

  • Una lista <SomeType>?

  • Una clase que deriva de la lista <SomeType>?

  • una clase que implementa IList <SomeType> (en cuyo caso un array puede ser considerada como una lista genérica - por ejemplo int [] implementa IList <int>)?

  • Una clase que es genérica e implementa IEnumerable (esta es la prueba propuesta en el accepted answer)? Pero esto también considerará la siguiente clase más bien patológica como una lista genérica:

.

public class MyClass<T> : IEnumerable 
{ 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return null; 
    } 
} 

La mejor solución (por ejemplo, si desea utilizar GetType, IsAssignableFrom, etc.) dependerá de a qué se refiere.

1

La respuesta aceptada no garantiza el tipo de IList <>. Comprobar esta versión, funciona para mí:

private static bool IsList(object value) 
{ 
    var type = value.GetType(); 
    var targetType = typeof (IList<>); 
    return type.GetInterfaces().Any(i => i.IsGenericType 
             && i.GetGenericTypeDefinition() == targetType); 
} 
Cuestiones relacionadas