Наследование интерфейса 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
16
задан ppiotrowicz 3 August 2010 в 10:03
поделиться

4 ответа

Вы должны определить некоторые Bindingflags в GetMethods().

Try

typeof(IB).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy).Count();
-1
ответ дан 30 November 2019 в 22:09
поделиться

Вот код для получения счетчиков для 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 !

11
ответ дан 30 November 2019 в 22:09
поделиться

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

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

9
ответ дан 30 November 2019 в 22:09
поделиться

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

2
ответ дан 30 November 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: