我试图反映到一个程序集中,并找出所有派生自泛型类型的类型。
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<>>()
如何过滤我的任何基础来自通用的?
答案 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();
}