Stefano Ricciardi Stefano Ricciardi - 1 year ago 61
C# Question

How to get the type contained in a collection through reflection

In some part of my code I am passed a collection of objects of type

. I don't know which concrete colletion I will be passed, other than it impements

At run time, I need to find out which type T is (e.g.
, etc...).

Is there any way to find it out?

UPDATE: I should maybe clarify a bit more the context I am working in (a Linq Provider).

My function has a signature like the following, where I get the type of the collection as a parameter:

string GetSymbolForType(Type collectionType)


Is there any way from
to get the contained objects type?

dtb dtb
Answer Source

From Matt Warren's Blog:

internal static class TypeSystem {
    internal static Type GetElementType(Type seqType) {
        Type ienum = FindIEnumerable(seqType);
        if (ienum == null) return seqType;
        return ienum.GetGenericArguments()[0];
    private static Type FindIEnumerable(Type seqType) {
        if (seqType == null || seqType == typeof(string))
            return null;
        if (seqType.IsArray)
            return typeof(IEnumerable<>).MakeGenericType(seqType.GetElementType());
        if (seqType.IsGenericType) {
            foreach (Type arg in seqType.GetGenericArguments()) {
                Type ienum = typeof(IEnumerable<>).MakeGenericType(arg);
                if (ienum.IsAssignableFrom(seqType)) {
                    return ienum;
        Type[] ifaces = seqType.GetInterfaces();
        if (ifaces != null && ifaces.Length > 0) {
            foreach (Type iface in ifaces) {
                Type ienum = FindIEnumerable(iface);
                if (ienum != null) return ienum;
        if (seqType.BaseType != null && seqType.BaseType != typeof(object)) {
            return FindIEnumerable(seqType.BaseType);
        return null;
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download