2010-08-03 132 views
16

考虑:C#接口继承

public interface IA 
{ 
    void TestMethod(); 
} 

public interface IB : IA 
{ 
} 

为什么:

typeof(IB).GetMethods().Count() == 0; 

只是要清楚:

public class A 
{ 
    public void TestMethod() 
    { 
    } 
} 

public class B : A 
{ 
} 

typeof(B).GetMethods().Count(); 

不工作(返回5);

还有一个好处:

typeof(IB).BaseType == null 

回答

-1

你必须定义一些的BindingFlags到的getMethods()。

尝试

typeof(IB).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy).Count(); 
+3

我忘了BindingFlags,因为他们没有帮助;)。 – ppiotrowicz 2010-08-03 09:34:52

+1

绑定标志在这种情况下不起作用。当涉及课程时他们会提供帮助。 – Manfred 2010-08-03 09:47:46

9

这似乎是功能的getMethods的设计。它不支持接口中的继承成员。如果你想发现所有的方法,你需要直接查询每种接口类型。

查看this MSDN article的社区内容部分。

11

这里是获取计数都IA和IB代码:

var ibCount = typeof(IB).GetMethods().Count(); // returns 0 
var iaCount = typeof (IB).GetInterfaces()[0].GetMethods().Count(); // return 1 

注意,在生产代码,我不会在代码中使用GetInterfaces()[0]因为通常在那里我会用这个我不能假设我将始终至少有一个接口。

我也尝试了的BindingFlags如下:

const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy; 
var ibCount = typeof(IB).GetMethods(bindingFlags).Count(); 

然而,这仍然会返回0作为接口IB仍然没有实现方法TestMethod()。界面IA呢。如果IAIB都是类,则使用绑定标志将起作用。但是,在这种情况下,您将得到5的返回值。不要忘记,IA隐含地从类Object派生!

+0

感谢您的回答。我知道我可以迭代接口并从中获取方法。 我的问题是为什么我不能这样做。 – ppiotrowicz 2010-08-03 11:58:57

2

将IA视为IB的接口,而不是其基础。