2010-10-29 19 views
7

Vì vậy, tôi đang phát xung quanh với EnvDTE và API EnvDTE.CodeModel và tôi đã tự hỏi liệu có cách nào để nhận giá trị văn bản được biểu thị bằng CodeElement hay không.tự động hóa vs2010: Nhận giá trị văn bản của EnvDTE.CodeElement

Giả sử tôi có một số CodeAttribute, có cách nào đó để nhận được một số string về số tiền CodeAttribute đại diện, ví dụ: [MyAttribute(value="myvalue")].

Tôi biết có thể xây dựng lại mã bằng cách sử dụng các thuộc tính khác nhau của CodeElement, ít nhất là trong một số trường hợp, nhưng đối với một số điều có vẻ như sẽ dễ dàng hơn để lấy văn bản.

Cảm ơn!

Trả lời

4

Giao diện CodeElement có các thuộc tính StartPointEndPoint đại diện cho phần bắt đầu và kết thúc của phần tử trong bộ đệm. Chúng chứa số dòng/cột có thể được chuyển đến các phương thức như IVsTextLines.GetLineText và cung cấp cho bạn giá trị bạn đang tìm kiếm.

Để có được IVsTextLines cho một CodeElement cho bạn có thể làm như sau

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

Tôi đoán câu hỏi tiếp theo của tôi nên được, làm thế nào để tôi nhận được một tham chiếu đến một 'IVsTextLines'? Tôi cũng tự hỏi nếu điều này sẽ yêu cầu các tập tin được mở trong trình soạn thảo, và do đó trong bộ đệm văn bản. Tôi đang cố gắng để thực hiện một cái gì đó dự án/giải pháp rộng, bằng cách sử dụng 'Project.CodeModel' vì vậy tôi sẽ khám phá mô hình mà không có tập tin được mở. Điều này có thể là không thể mặc dù. –

+0

@MasterMorality bạn đã kết thúc tìm ra cách để có được tham chiếu đến IVsTextLines? –

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("}"); 

    } 
0

Ngoài các câu trả lời bằng @JaredPar, một cách tiếp cận khác sẽ là:

public string GetText(CodeAttribute attribute) 
{ 
    return attribute.StartPoint.CreateEditPoint().GetText(attribute.EndPoint); 
} 

Đó là nó !! (Cảm ơn @JaredPar cho các con trỏ)

Nguồn:http://msdn.microsoft.com/en-us/library/envdte.editpoint.gettext.aspx

Các vấn đề liên quan