Наследование интерфейса C # - PullRequest
16 голосов
/ 03 августа 2010

Дано:

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

Ответы [ 4 ]

11 голосов
/ 03 августа 2010

Вот код для получения счетчиков для IA и IB:

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

Обратите внимание, что в рабочем коде я бы не использовал GetInterfaces()[0], как обычно в коде, где я использовал бы это, я не могу предположить, что у меня всегда будет хотя бы один интерфейс.

Я также опробовал флаги привязки следующим образом:

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

Однако, это все равно вернет 0, так как интерфейс IB все еще не реализует метод TestMethod(). Интерфейс IA делает. Использование флагов привязки сработало бы, если бы оба класса IA и IB были классами. Однако в этом случае вы получите возвращаемое значение 5. Не забывайте, что IA неявно наследуется от класса Object!

9 голосов
/ 03 августа 2010

Кажется, это дизайн функции GetMethods.Он не поддерживает унаследованные члены в интерфейсах.Если вы хотите узнать все методы, вам нужно запросить каждый тип интерфейса напрямую.

Ознакомьтесь с разделом контента сообщества этой статьи MSDN .

2 голосов
/ 03 августа 2010

Считайте IA интерфейсом IB, а не его базой.

0 голосов
/ 03 августа 2010

Вы должны определить несколько флагов привязки в GetMethods ().

Попробуйте

typeof(IB).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy).Count();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...