views:

173

answers:

4

Given:

public interface IA
{
    void TestMethod();
}

public interface IB : IA
{
}

Why:

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

?

Just to be clear:

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

public class B : A
{
}

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

does work (it returns 5);

As a bonus:

typeof(IB).BaseType == null
+1  A: 

You have to define some Bindingflags into GetMethods().

Try

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

Kristof DB
I've ommited BindingFlags because they are not helping ;).
ppiotrowicz
Binding flags don't help in this case. They help when classes are involved.
John
+4  A: 

This seems to be the design of the GetMethods function. It doesn't support inherited members in interfaces. If you want to discover all the methods, you need to query each interface type directly.

Check out the community content section of this MSDN article.

Matthew Abbott
+6  A: 

Here is the code for getting the counts for both IA and IB:

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

Note that in production code I wouldn't use GetInterfaces()[0] as typically in the code where I would use this I can't assume that I will always have at least one interface.

I also tried out the bindingflags as follows:

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

However, this will still return 0 as interface IB still doesn't implement method TestMethod(). Interface IA does. Using binding flags would work if both IA and IB were classes. In that case however, you get a return value of 5. Don't forget that IA implicitly derives from class Object!

John
Thanks for that answer. I know I can iterate over interfaces and get methods from them.My question was why can't I do it that way.
ppiotrowicz
+1  A: 

Consider IA to be an interface of IB, not its base.

Tormod