2016-06-07 76 views
2

如何通過反射獲取接口的基本接口?我試圖調用BaseType propery,但它的值爲null。之後,我需要找到通用類型的接口。通過C#反射獲取接口的基本接口#

我需要找到Foo類型ISomeInterfaceForItem這個樣本。

Type oType = typeof(ISomeInterfaceForItem); 

Type oBase = oType.BaseType; // equals null 

public interface ISomeInterfaceForItem: ISomeInterface<Foo> 
{   
} 

public interface ISomeInterface<T> 
{ 
} 
+0

謝謝@Jon Skeet指出我的錯誤。我糾正了問題。 – hkutluay

+4

接口*似乎*具有BaseType是由C#語法創建的錯覺。沒有那樣,你只是繼承了實現其他接口的需要。改用oType.GetInterfaces()。 –

回答

3

你可以使用GetInterface()繼承的接口和枚舉使用GetGenericArguments()通用參數:

Type generic = typeof(I2).GetInterface("ISomeInterfaceForItem`1")?. 
          GetGenericArguments().FirstOrDefault(); 
5

接口不參與繼承,所以BaseType是沒有意義的。相反,你需要看到由給定類型實現什麼樣的接口:

oType 
    .FindInterfaces((t, _) => t.IsGenericType && t.GetGenericTypeDefinition() 
          == typeof(ISomeInterface<>), null) 
    .Select(i => i.GetGenericArguments().First()) 

注意,一個類可以實現的ISomeInterface<>多個變體 - 例如class MyClass : ISomeInterface<Foo>, ISomeInterface<Bar> - 這就是爲什麼上面的示例的結果是類型的枚舉,而不僅僅是一種類型。