System.Type类提供了一个GetInterfaces()方法,“获取当前Type实现或继承的所有接口”。 问题是“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());
}
提前致谢
答案 0 :(得分:3)
我认为你不会找到一个简单的解决方案。您的问题是,最终,Foo
实际上实现了所有接口,而不管它们的内部继承层次结构如何。如果你使用Ildasm或类似的工具检查Foo
,这就变得明显了。请考虑以下代码:
interface IFirst { }
interface ISecond : IFirst { }
class Concrete : ISecond { }
生成的IL代码(从Ildasm转储):
.class private auto ansi beforefieldinit MyNamespace.Concrete
extends [mscorlib]System.Object
implements MyNamespace.ISecond,
MyNamespace.IFirst
{
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Concrete::.ctor
} // end of class MyNamespace.Concrete
正如您所看到的,在此级别上Concrete
与两个接口之间的关系没有区别。