如何检测T是否为IEnumerable <T2>,如果是,则获取T2的类型?

Ben*_*jol 5 c# generics reflection

我知道这个问题,它是后续的,也是这个问题,但我不能把它们放在一起,以帮助我做我想做的事情:

我有一个泛型类型,我想检查T是否为structOR,如果它实现IEnumerable<T2>,那么我想检查T2是否struct.

到目前为止,我已经到了这里('请原谅代码,这是实验性的):

private class TestClass<T>
{
    public TestClass()
    {
        Type type = typeof(T);
        //(detecting T == IEnumerable<something> ommitted for clarity)
        Type enumerableType = type.GetInterfaces()
                .Where(t => t.IsGenericType)
                .Select(t => t.GetGenericTypeDefinition())
                .Where(t => t == typeof(IEnumerable<>))
                .FirstOrDefault();
        if(enumerableType != null) 
        {
            Type enumeratedType = type.GetGenericArguments().First();
            if(!enumeratedType.IsValueType) //throw etc...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题enumerableTypeIEnumerable<>,所以enumeratedType它出来了T,而不是我传入的任何东西(例如new TestClass<int[]>()).

Ben*_*igt 4

您的问题是您已经选择了具有所有数据的类型,以支持其已删除的通用类型模板。

尝试:

    Type enumerableType = type.GetInterfaces()
            .Where(t => t.IsGenericType)
            .Where(t => t.GetGenericTypeDefinition() == typeof(IEnumerable<>))
            .Select(t => t.GetGenericArguments()[0])
            .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)