2011-06-07 58 views
4

我有一個接口:我可以返回具有特定泛型類型的所有通用對象嗎?

public interface InterfaceA<S,T>{} 

,我想加載實現此接口的所有類的一個實例,無論通用參數ST的。所以我有一個方法來做到這一點。方法簽名是目前:

public IEnumerable<object> GetInstancesOfImplementingTypes (Type targetType) 

通過加載的程序集,以反映查找具有一個GetGenericTypeDefinition等於targetTypeGetGenericTypeDefinition類型。我使用的類型(而不是在方法一件T PARAM),這樣我就不必指定通用參數,即我可以調用它像這樣:

var foundinstances = o.GetInstancesOfImplementingTypes(typeof(InterfaceA<,>)) 

但我似乎有將找到的類型的實例作爲對象返回。是否有某種方式可以返回比只是對象更多的約束類型,因爲我知道所有的實例都會執行一些InterfaceA,我只是不知道ST會是什麼。

+0

這將必須是反射觀察查詢爲InterfaceA情況下的結果,而不是仿製藥 – 2011-06-07 15:08:27

+0

@Marc吧?請用英文? – 2011-06-07 15:37:13

+0

在運行時,您可以詢問對象具有哪些接口,然後針對每個請求:是通用的;如果是這樣,什麼是開放的泛型類型 - 是這樣嗎?很多工作,相對較慢。如果你想要一個例子,我可以添加它,但可以說最好避免他的場景。 – 2011-06-07 16:09:36

回答

5

不可以。就CLR而言,InterfaceA<S,T>的不同實例是不相關的,因此除非它們具有非通用公共基礎,否則您必須使用object。

如果在InterfaceA中有一些成員不依賴於類型參數,並且您希望無論S和T如何訪問,您可能希望創建另一個非泛型接口,該接口僅包含那些成員。

2

不.Net中沒有辦法聲明一個鍵入爲InteraceA<,>的實例或其中省略參數的任何泛型類型。

解決此問題的一種方法是將接口分解爲2個接口。一個是非泛型的,包含不是特定於泛型參數的方法,另一個泛型幷包含方法。然後在這些類型之間創建一個繼承關係。例如

interface InterfaceA { 
    void SomeOperation(); 
} 
interface InterfaceA<T, S> : InterfaceA { 
    T SomeOtherOperation(S p1); 
} 

這使您可以通過Cast擴展方法

var foundinstances = o 
    .GetInstancesOfImplementingTypes(typeof(InterfaceA<,>)) 
    .Cast<InterfaceA>(); 
相關問題