Byron Sommardahl Byron Sommardahl - 1 month ago 6
C# Question

How to determine if a type is a type of collection?

I am trying to determine if a runtime type is some sort of collection type. What I have below works, but it seems strange that I have to name the types that I believe to be collection types in an array like I have done.

In the code below, the reason for the generic logic is because, in my app, I expect all collections to be generic.

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));
}


How would I refactor this code to be smarter or simpler?

Answer

Really all of these types inherit IEnumerable. You can check only for it:

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

or if you really need to check for ICollection:

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

Look at "Syntax" part: