2017-05-17 29 views
0

我想反映到一個程序集並獲得所有從泛型派生的類型。反射濾波器類型按通用基地

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(); 
} 

然而,當我嘗試調用過濾方法我無法通過一個類型少通用

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

我怎樣可以過濾任何地方我的基礎是從一個普通的一個derrive?

+1

添加一個接受Type作爲參數的非泛型重載,那麼你可以通過'typeof(AbstractValidator <>)' – Gusman

+0

@Gusman我的邏輯的其餘部分仍然會工作?我不需要比較泛型類型定義? –

+0

看看我的答案。 – Gusman

回答

2

無類型泛型類型不能用於泛型函數,它們只能用於獲取類型。

解決您的問題創建一個非泛型重載接受一個類型參數,並使用它:

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<>)); 
+0

感謝讓我測試這真快 –

+0

類型通過很好,但它仍然沒有正確過濾,我需要檢查基類型仍然 –

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(); 
}