反射过滤器类型由Generic Base

时间:2017-05-17 15:49:38

标签: c# generics reflection

我试图反映到一个程序集中,并找出所有派生自泛型类型的类型。

protected List<Assembly> _assemblies = new List<Assembly>(); 

public List<Type> FilterByType<T>()
{
    return this._assemblies.SelectMany(x => x.GetTypes()).Where(type => typeof (T).IsAssignableFrom(type)).ToList();
}

但是当我尝试调用filter方法时,我无法传递Type-Less Generic

// This does not compile because it's an unbound generic
FilterByType<AbstractValidator<>>()

如何过滤我的任何基础来自通用的?

2 个答案:

答案 0 :(得分:2)

无类型泛型类型不能用于泛型函数,它们只能用于获取类型。

要解决您的问题,请创建一个接受Type参数的非泛型重载并使用它:

protected List<Assembly> _assemblies = new List<Assembly>(); 

public List<Type> FilterByType<T>()
{
    return this._assemblies.SelectMany(x => x.GetTypes()).Where(type => typeof (T).IsAssignableFrom(type)).ToList();
}

public List<Type> FilterByType(Type BaseType)
{
    return this._assemblies.SelectMany(x => x.GetTypes()).Where(type => BaseType.IsAssignableFrom(type)).ToList();
}

然后你可以这样称呼它:

var types = FilterByType(typeof(AbstractValidator<>));

答案 1 :(得分:0)

我结束了过滤它们:

public static class TypeExensions
{
    public static IEnumerable<Type> BaseTypeAsEnumerable(this Type type)
    {
        for (; null != type && type != typeof(object); type = type.BaseType)
            yield return type;
    }
}

public List<Type> FilterByGenericType(Type genericType)
{
    return this._assemblies.SelectMany(x => x.GetTypes())
        .Where(fullType => fullType.BaseTypeAsEnumerable()
                                .Where(type => type.IsGenericType)
                                .Any(baseType => baseType.GetGenericTypeDefinition() == genericType))
        .ToList();
}
相关问题