Класс System.Type предоставляет метод GetInterfaces (), который «получает все интерфейсы, реализованные или унаследованные текущим типом».
Проблема заключается в том, что «метод GetInterfaces не возвращает интерфейсы в определенном порядке, например в алфавитном порядке или в порядке объявления. Ваш код не должен зависеть от порядка, в котором возвращаются интерфейсы, поскольку этот порядок меняется».
В моем случае, однако, мне нужно изолировать и представить (через WCF) только конечные интерфейсы иерархии интерфейсов, то есть интерфейсы, которые не наследуются другими интерфейсами в этой иерархии. Например, рассмотрим следующую иерархию
interface IA { }
interface IB : IA { }
interface IC : IB { }
interface ID : IB { }
interface IE : IA { }
class Foo : IC, IE {}
Листовыми интерфейсами Foo являются IC и IE, тогда как GetInterfaces () вернет все 5 интерфейсов (IA..IE).
Также предусмотрен метод FindInterfaces (), позволяющий фильтровать вышеупомянутые интерфейсы с использованием предиката по вашему выбору.
Моя текущая реализация приведена ниже. Это O (n ^ 2), где n - количество интерфейсов, которые реализует тип. Мне было интересно, есть ли более изящный и / или эффективный способ сделать это.
private Type[] GetLeafInterfaces(Type type)
{
return type.FindInterfaces((candidateIfc, allIfcs) =>
{
foreach (Type ifc in (Type[])allIfcs)
{
if (candidateIfc != ifc && candidateIfc.IsAssignableFrom(ifc))
return false;
}
return true;
}
,type.GetInterfaces());
}
Заранее спасибо