2010-10-29 22 views
7

所以我在玩EnvDTEEnvDTE.CodeModel API,並且我想知道是否有一種方法來獲取由CodeElement表示的文本值。vs2010 automation:獲取EnvDTE.CodeElement的文本值

假設我有CodeAttribute,是否有某種方法可以獲得CodeAttribute表示的string,即[MyAttribute(value="myvalue")]

我知道可以使用CodeElement的各種屬性重構代碼,至少在某些情況下,但對於某些情況來說,似乎只是獲取文本會更容易。

謝謝!

回答

4

CodeElement接口的屬性爲StartPointEndPoint,它們表示緩衝區內元素的開始和結束。這些包含行號/列,可以傳遞給像IVsTextLines.GetLineText這樣的方法,並讓您找回要查找的值。

要獲得IVsTextLines對於一個給定CodeElement,你可以做以下

CodeElement ce = ...; 
TextDocument td = ce.StartPoint.Parent; 
IVsTextLines lines = td as IVsTextLines; 
+1

我想我的下一個問題應該是,我怎麼到'IVsTextLines'的參考?我也想知道這是否會要求文件在編輯器中打開,並因此在文本緩衝區中打開。我正在嘗試使用'Project.CodeModel'來實現一些項目/解決方案,這樣我就可以在沒有打開文件的情況下探索模型。這可能不可能。 – 2010-10-30 19:12:51

+0

@MasterMorality你最終搞清楚如何獲得對IVsTextLines的引用? – 2014-01-30 16:40:57

3
void WriteMapping(CodeProperty codeProperty) 
{ 
    WriteLine(""); 
    WriteLine("///CodeProperty"); 
    WriteLine("///<summary>"); 
    WriteLine("///"+codeProperty.FullName); 
    WriteLine("///</summary>"); 
    if(codeProperty.Getter==null && codeProperty.Setter==null) 
     return; 
    if(codeProperty.Attributes!=null){ 
     foreach(CodeAttribute a in codeProperty.Attributes) 
     { 
      Write("["+a.FullName); 
      if(a.Children!=null && a.Children.Count>0) 
      { 
       var start=a.Children.Cast<CodeElement>().First().GetStartPoint(); 
       var finish= a.GetEndPoint(); 
       string allArguments=start.CreateEditPoint().GetText(finish); 

       Write("("+allArguments); 
      } 
    WriteLine("]"); 
     } 
     } 
    Write("public "+GetFullName(codeProperty.Type) +" "+codeProperty.Prototype); 

    Write(" {"); 
    //if(codeProperty.Getter!=null && codeProperty.Getter.Access!=vsCMAccess.vsCMAccessPrivate) 
     Write("get;"); 
    //if(codeProperty.Setter!=null) 
     Write("set;"); 
    WriteLine("}"); 

    }