Автоматизация vs2010: получение текстового значения EnvDTE.CodeElement - PullRequest
7 голосов
/ 29 октября 2010

Так что я играюсь с EnvDTE и EnvDTE.CodeModel API, и мне было интересно, есть ли способ получить текстовое значение, представленное CodeElement.

Скажем, у меня есть CodeAttribute, есть ли способ получить string того, что представляет CodeAttribute, то есть [MyAttribute(value="myvalue")].

Я знаю, что можно восстановить код, используя различные свойства CodeElement, по крайней мере, в некоторых сценариях, но для некоторых вещей, кажется, было бы проще просто получить текст.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 29 октября 2010

Интерфейс CodeElement имеет свойства StartPoint и EndPoint, которые представляют начало и конец элемента в буфере.Они содержат номер строки / столбец, который можно передать таким методам, как IVsTextLines.GetLineText, и вернуть вам искомое значение.

Чтобы получить IVsTextLines для данного CodeElement, вы можетеследующие

CodeElement ce = ...;
TextDocument td = ce.StartPoint.Parent;
IVsTextLines lines = td as IVsTextLines;
3 голосов
/ 09 мая 2012
  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("}");

   }
2 голосов
/ 30 января 2014

В дополнение к ответу @JaredPar, альтернативный подход будет:

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

Вот и все !! (Спасибо @JaredPar за указатели)

Источник: http://msdn.microsoft.com/en-us/library/envdte.editpoint.gettext.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...