Данный:
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
Вы должны определить некоторые Bindingflags в GetMethods().
Try
typeof(IB).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy).Count();
Вот код для получения счетчиков для 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
!
Похоже, это дизайн функции GetMethods. Он не поддерживает унаследованные члены в интерфейсах. Если вы хотите обнаружить все методы, вам нужно напрямую запросить каждый тип интерфейса.
Ознакомьтесь с разделом содержимого сообщества этой статьи MSDN .