2010-04-15 2 views
2

Visual Studio 추가 기능에서 현재 소스 파일의 클래스 멤버를 열거하고 있습니다. 속성 (예 : CodeElement.Kind == vsCMElement.vsCMElementProperty)이 발생하면 해당 CodeElement를 CodeProperty로 캐스팅하고 속성의 이름과 유형을 볼 수 있습니다.Visual Studio 2008 추가 기능에서 클래스 속성이 구현하는 인터페이스를 어떻게 알 수 있습니까?

문제가있는 것은 해당 속성의 구현 된 인터페이스 목록을 얻는 것입니다. 구현 된 인터페이스가 Visual Studio가 "알지 못하는"어셈블리에있을 수 있기 때문인지 궁금합니다.

속성이 구현하는 인터페이스 목록을 가져 오는 방법이 있습니까?

감사합니다.

답변

3

예. 속성이 클래스 (CodeClass)인지 인터페이스 (CodeInterface)인지 확인해야합니다. 두 경우 모두 모든 코드 (클래스/인터페이스) .Bases를 반복하고 ImplementedInterfaces를 재귀 적으로 확인해야합니다. 여기

어떤 예를 코드 (참고 :이 그냥 생각하는 것입니다) 당신의 응답을


     private void ProcessDocument() 
     { 
      CodeElements elements = _applicationObject.ActiveDocument.ProjectItem.FileCodeModel.CodeElements; 
      foreach (CodeElement element in elements) 
      { 
       if (element.Kind == vsCMElement.vsCMElementNamespace) 
       { 

        CodeNamespace ns = (CodeNamespace)element; 
        foreach (CodeElement elem in ns.Members) 
        { 
         if (elem is CodeClass) 
         { 
          CodeClass cls = elem as CodeClass; 
          foreach (CodeElement member in cls.Members) 
           if (member is CodeProperty) 
           { 
            CodeType memberType = ((member as CodeProperty)).Type.CodeType; 
            ProcessElem(memberType as CodeElement); 
           } 
         } 
        } 
       } 
      } 
     } 

     private void ProcessElem(CodeElement elem) 
     { 
      if (null == elem) return; 
      // we only care about elements that are classes or interfaces. 
      if (elem is CodeClass) 
      { 

       CodeClass cls = elem as CodeClass; 
       CodeElements intfs = cls.ImplementedInterfaces; 

       // do whatever with intfs 
       // ... 

       CodeElements bases = cls.Bases; 
       foreach (CodeElement baseElem in bases) 
        ProcessElem(baseElem); 
      } 
      else if (elem is CodeInterface) 
      { 
       // same as class, figure out all other interfaces this interface 
       // derives from if needed 
      } 
     } 
+0

감사합니다. 구현 된 인터페이스를 얻으려고하는 요소는 CodeClass가 있다고 생각하지 않는 속성 (예 : CodeElement.Kind == vsCMElement.vsCMElementProperty)입니다. CodeElement 객체에서 CodeClass 객체를 가져 오는 방법을 알고 있습니까? –

+0

보다 포괄적 인 예제로 업데이트되었습니다. – CDSO1

관련 문제