Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# interface inheritance

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
like image 275
ppiotrowicz Avatar asked Aug 03 '10 09:08

ppiotrowicz


2 Answers

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!

like image 149
Manfred Avatar answered Oct 05 '22 08:10

Manfred


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.

like image 43
Matthew Abbott Avatar answered Oct 05 '22 08:10

Matthew Abbott