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

时间:2009-03-12 10:14:53

标签: c# .net generics reflection

我需要验证一个对象以查看它是否为null,值类型,或IEnumerable<T>其中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.
}

所以我发现对象为空,值类型,或某些IEnumerable<T>的{​​{1}};如何检查T是否为值类型?

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

你能用GetGenericArguments做点什么吗?

答案 2 :(得分:0)

我的通用贡献,检查给定类型(或其基类)是否实现了类型为T的接口:

public static bool ImplementsInterface(this Type type, Type interfaceType)
{
    while (type != null && type != typeof(object))
    {
        if (type.GetInterfaces().Any(@interface => 
            @interface.IsGenericType
            && @interface.GetGenericTypeDefinition() == interfaceType))
        {
            return true;
        }

        type = type.BaseType;
    }

    return false;
}