如何通过反射获取集合中包含的类型

Ste*_*rdi 11 c# reflection collections

在我的代码的某些部分,我传递了一组类型的对象T.我不知道我将通过哪个具体的收集,除了它的要求IEnumerable.

在运行时,我需要找出哪些类型T(例如System.Double,System.String等...).

有什么方法可以找到它吗?

更新:我应该澄清一下我正在工作的背景(一个Linq提供者).

我的函数有如下的签名,我将集合的类型作为参数:

string GetSymbolForType(Type collectionType)
{

}
Run Code Online (Sandbox Code Playgroud)

是否有任何方法collectionType来获取包含的对象类型?

dtb*_*dtb 19

来自Matt Warren的博客:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)


nit*_*one 9

myCollection.GetType().GetGenericArguments() 
Run Code Online (Sandbox Code Playgroud)

将返回args类型的数组.