2016-06-07 123 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> - 这就是为什么上面的示例的结果是类型的枚举,而不仅仅是一种类型。