2011-08-19 70 views
2

我想向使用插件的類添加一些屬性。我可以得到下面的代碼來工作,除了我希望新行上的屬性都包含在[]中。我該怎麼做呢?使用filecodemodel添加屬性

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] 。

回答

0

簽名爲您所使用的方法:

CodeAttribute AddAttribute(
    string Name, 
    string Value, 
    Object Position 
) 
  1. 如果您不需要的屬性值,使用String.Empty場第二個參數
  2. 第三個參數是爲Position。在你的代碼中,你爲0設置了這個參數三次,VS認爲這是相同的屬性。因此,使用一些指標,這樣的:

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

如果你不想使用索引,使用-1值 - 這將在集合的末尾增加新的屬性。

More on MSDN

+0

感謝您的輸入反應。我曾嘗試使用0,1和2作爲相對位置,但位置與上述相同。 – user393148

+0

我也試過string.empty。 Thta給了我PriMethod()而不僅僅是PriMethod。 – user393148

+0

@ user393148嘗試使用'-1'。另外我忘了提及,該索引從「1」開始,因此請嘗試使用1,2,3. – VMAtm

0

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

    } 
}