with type strategy smell data code bad c# collections types refactoring

c# - type - ¿Cómo determinar si un tipo es un tipo de colección?



bad smell data class (5)

Puede usar este método auxiliar para verificar si un tipo implementa una interfaz genérica abierta. En su caso, puede usar DoesTypeSupportInterface(type, typeof(Collection<>))

public static bool DoesTypeSupportInterface(Type type,Type inter) { if(inter.IsAssignableFrom(type)) return true; if(type.GetInterfaces().Any(i=>i. IsGenericType && i.GetGenericTypeDefinition()==inter)) return true; return false; }

O simplemente puede buscar el IEnumerable no genérico. Todas las interfaces de colección heredan de él. Pero no llamaría a ningún tipo que implemente una colección IEnumerable .

Estoy tratando de determinar si un tipo de tiempo de ejecución es algún tipo de tipo de colección. Lo que tengo a continuación funciona, pero parece extraño que tenga que nombrar los tipos que creo que son tipos de colección en una matriz como lo he hecho.

En el código a continuación, el motivo de la lógica genérica es que, en mi aplicación, espero que todas las colecciones sean genéricas.

bool IsCollectionType(Type type) { if (!type.GetGenericArguments().Any()) return false; Type genericTypeDefinition = type.GetGenericTypeDefinition(); var collectionTypes = new[] { typeof(IEnumerable<>), typeof(ICollection<>), typeof(IList<>), typeof(List<>) }; return collectionTypes.Any(x => x.IsAssignableFrom(genericTypeDefinition)); }

¿Cómo puedo refactorizar este código para que sea más inteligente o más simple?


Puedes usar linq, busca un nombre de interfaz como

yourobject.GetType().GetInterfaces().Where(s => s.Name == "IEnumerable")

Si esto tiene valores es una instancia de IEnumerable .


Realmente todos estos tipos heredan IEnumerable . Solo puedes comprobarlo:

bool IsEnumerableType(Type type) { return (type.GetInterface(nameof(IEnumerable)) != null); }

o si realmente necesitas verificar por ICollection:

bool IsCollectionType(Type type) { return (type.GetInterface(nameof(ICollection)) != null); }

Mira la parte "Sintaxis":


Sé que este hilo es antiguo, pero aquí hay un ejemplo moderno a partir del 20 de julio de 2015, según Microsoft is palabra clave.

if(collection is ICollection) return true;


Todos ellos heredan IEnumerable (), lo que significa que comprobar si debería haber suficiente: