¿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
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?
Hay una función GetType() en la clase System.Object. ¿Has probado eso?
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. –
GetType devolverá la lista genérica específica que es, a diferencia del hecho de que es solo una lista genérica. – Dested
Probar:
if(yourList.GetType().IsGenericType)
{
var genericTypeParams = yourList.GetType().GetGenericArguments;
//do something interesting with the types..
}
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();
}
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.
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);
}
- 1. ¿Cómo verifico si un valor dado es una lista genérica?
- 2. Compruebe si un objeto es una colección genérica
- 3. Buscar objeto en la lista genérica
- 4. Objeto emitido a la lista genérica
- 5. es operador en la lista genérica
- 6. Lista genérica/Diccionario
- 7. Adición de objeto genérico a la lista genérica en C#
- 8. de acceso directo para "nula si el objeto es nulo, o object.member si el objeto no es nulo"
- 9. ¿Cómo hacer una lista genérica igual otra lista genérica
- 10. Una lista genérica de genéricos
- 11. Matriz de lista genérica
- 12. y la lista genérica
- 13. lista genérica .First LINQ
- 14. Ordenar lista genérica
- 15. Determine si el objeto es entero
- 16. Mangosta: compruebe si el objeto es un objeto de mangosta
- 17. ¿Convertir DataTable a lista genérica?
- 18. cómo comprobar si el objeto ya existe en una lista
- 19. C# ejemplifican lista genérica de tipo reflejada
- 20. Compruebe si el objeto está en una lista de objetos
- 21. deserializar una lista genérica devuelve null
- 22. C# arsenal vs lista genérica
- 23. Cómo especificar una lista genérica Serializable
- 24. Lista genérica FindAll() vs. foreach
- 25. compruebe si un objeto es nulo
- 26. ¿Cómo puedo saber si una propiedad es una colección genérica?
- 27. Determinar si el objeto es cualquier predicado <T>
- 28. Convertir DataTable a lista genérica en C#
- 29. Inicialización de una lista genérica en C#
- 30. casting un objeto a una interfaz genérica
Esto no se compila actualmente. https://dotnetfiddle.net/T0Q8w3. Tal vez lo hizo en '08. – sonicblis
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 :) –
@Timothy_Khouri, ah, lo tengo. Gracias por el puntero. – sonicblis