Подтвердить что ты не робот

Наследование интерфейса С#

Дано:

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
4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Рассмотрим IA как интерфейс IB, а не его базу.

Ответ 4

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

Try

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