对于任何值类型T,如何确定对象的类型是否为IEnumerable <T>的子类?

Sim*_*mon 9 .net c# generics reflection

我需要验证一个对象,看它是否为null,值类型,或者IEnumerable<T>where T值是一个值类型.到目前为止,我有:

if ((obj == null) ||
    (obj .GetType().IsValueType))
{
    valid = true;
}
else if (obj.GetType().IsSubclassOf(typeof(IEnumerable<>)))
{
     // TODO: check whether the generic parameter is a value type.
}
Run Code Online (Sandbox Code Playgroud)

所以我发现对象是null,值类型,或IEnumerable<T>某些T; 如何检查这是否T是值类型?

Mar*_*ell 12

(编辑 - 添加值类型位)

您需要检查它实现的所有接口(注意它理论上可以实现IEnumerable<T>多个T):

foreach (Type interfaceType in obj.GetType().GetInterfaces())
{
    if (interfaceType.IsGenericType
        && interfaceType.GetGenericTypeDefinition() == typeof(IEnumerable<>))
    {
        Type itemType = interfaceType.GetGenericArguments()[0];
        if(!itemType.IsValueType) continue;
        Console.WriteLine("IEnumerable-of-" + itemType.FullName);
    }
}
Run Code Online (Sandbox Code Playgroud)