2009-09-22 5 views
3

System.Type 클래스는 "현재 유형에서 구현되거나 상속 된 모든 인터페이스를 가져옵니다"GetInterfaces() 메소드를 제공합니다. "GetInterfaces 메서드는 알파벳 순서 또는 선언 순서와 같은 특정 순서로 인터페이스를 반환하지 않으므로 코드가 반환되는 순서에 따라 달라져서는 안됩니다. 순서가 다양하기 때문에"입니다. 필자의 경우 인터페이스 계층의 리프 인터페이스, 즉 해당 계층의 다른 인터페이스에서 상속받지 않은 인터페이스 만 격리하고 노출해야합니다 (WCF를 통해). 의 getInterfaces()는 모두 5 개 인터페이스 (IA..IE)을 반환하는 반면 예를 들어,유형의 리프 인터페이스 검색

interface IA { } 
interface IB : IA { } 
interface IC : IB { } 
interface ID : IB { } 
interface IE : IA { } 
class Foo : IC, IE {} 

푸의 잎 인터페이스 IC와 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()); 
    } 

덕분에

답변

3

나는이에 대한 간단한 해결책을 찾을 수 있다고 생각하지 않습니다. 문제는 결국 내부 상속 계층 구조에 관계없이 Foo이 실제로 모든 인터페이스을 구현한다는 것입니다. Ildasm 또는 이와 유사한 도구를 사용하여 Foo을 검사하면 이것이 분명합니다.

interface IFirst { } 
interface ISecond : IFirst { } 
class Concrete : ISecond { } 

얻어진 IL 코드 (인 ildasm 덤핑) : 볼 수있는 바와 같이,이 레벨에 Concrete 관계에 차이 두 인터페이스

.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 

없다 다음 코드를 고려 .

+0

고마워요! 아마도 내 GetLeafInterfaces() 함수는 앞으로 누군가에게 유용 할 수 있습니다. –

관련 문제