добавить атрибут с помощью filecodemodel - PullRequest
2 голосов
/ 19 августа 2011

Я пытаюсь добавить несколько атрибутов в класс с помощью надстройки.Я могу заставить работать следующий код, за исключением того, что мне нужны атрибуты в новых строках, каждая из которых содержится в [].Как мне это сделать?

if (element2.Kind == vsCMElement.vsCMElementFunction)
{
    CodeFunction2 func = (CodeFunction2)element2;
    if (func.Access == vsCMAccess.vsCMAccessPublic)
    {
        func.AddAttribute("Name", "\"" + func.Name + "\"", 0);
        func.AddAttribute("Active", "\"" + "Yes" + "\"", 0);
        func.AddAttribute("Priority", "1", 0);
    }
}

Атрибуты добавляются в публичный метод, например

[Name("TestMet"), Active("Yes"), Priority(1)]

Где, как я хочу, как

[Name("TestMet")]
[Active("Yes")]
[Priority(1)]
public void TestMet()
{}

Также как можноЯ добавляю атрибут без какого-либо значения, например [PriMethod].

Ответы [ 2 ]

0 голосов
/ 04 января 2013

Базовый метод AddAttribute не поддерживает это, поэтому я написал метод расширения, чтобы сделать это для меня:

public static class Extensions
{
    public static void AddUniqueAttributeOnNewLine(this CodeFunction2 func, string name, string value)
    {
        bool found = false;
        // Loop through the existing elements and if the attribute they sent us already exists, then we will not re-add it.
        foreach (CodeAttribute2 attr in func.Attributes)
        {
            if (attr.Name == name)
            {
                found = true;
            }
        }
        if (!found)
        {
            // Get the starting location for the method, so we know where to insert the attributes
            var pt = func.GetStartPoint();
            EditPoint p = (func.DTE.ActiveDocument.Object("") as TextDocument).CreateEditPoint(pt);

            // Insert the attribute at the top of the function
            p.Insert(string.Format("[{0}({1})]\r\n", name, value));

            // Reformat the document, so the new attribute is properly aligned with the function, otherwise it will be at the beginning of the line.
            func.DTE.ExecuteCommand("Edit.FormatDocument");
        }

    }
}
0 голосов
/ 19 августа 2011

Подпись для используемого вами метода:

CodeAttribute AddAttribute(
    string Name,
    string Value,
    Object Position
)
  1. Если вам не нужно значение для атрибута, используйте поле String.Empty для второго параметра
  2. Третийпараметр для Position.В вашем коде вы устанавливаете этот параметр три раза для 0, и VS считает, что это один и тот же атрибут.Так что используйте некоторый индекс, например:

func.AddAttribute("Name", "\"" + func.Name + "\"", 1);<br> func.AddAttribute("Active", "\"" + "Yes" + "\"", 2);<br> func.AddAttribute("Priority", "1", 3);

Если вы не хотите использовать индекс, используйте значение -1 - это добавит новый атрибут в концеколлекции.

Подробнее о MSDN

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