EnvDTE可以走的路。您可以開發VisualStudio加載項,然後修改Exec方法。在這種方法中,您必須獲取活動文檔及其ProjectItem。這是你找到包含很多CodeElements的CodeModel的地方。在這些元素中你必須找到CodeNamespace,並且在這個元素裏面CodeClass。這是響應AddFunction的對象,返回可添加屬性和代碼的新CodeFunction(這是我不太喜歡的部分,因爲您必須使用EditPoint)。
這是Exec的一個非常簡單的版本,你可以作爲一個起點使用:
public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
{
handled = false;
if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
{
handled = true;
if (commandName == "TestAddMethod.Connect.TestAddMethod")
{
Document activeDoc = _applicationObject.ActiveDocument;
if (activeDoc == null)
return;
ProjectItem prjItem = activeDoc.ProjectItem;
if (prjItem == null)
return;
FileCodeModel fcm = prjItem.FileCodeModel;
if (fcm == null)
return;
CodeElements ces = fcm.CodeElements;
// look for the namespace in the active document
CodeNamespace cns = null;
foreach (CodeElement ce in ces)
{
if (ce.Kind == vsCMElement.vsCMElementNamespace)
{
cns = ce as CodeNamespace;
break;
}
}
if (cns == null)
return;
ces = cns.Members;
if (ces == null)
return;
// look for the first class
CodeClass cls = null;
foreach (CodeElement ce in ces)
{
if (ce.Kind == vsCMElement.vsCMElementClass)
{
cls = ce as CodeClass;
break;
}
}
if (cls == null)
return;
CodeFunction cf = cls.AddFunction("TestMethod1", vsCMFunction.vsCMFunctionFunction, vsCMTypeRef.vsCMTypeRefVoid, -1, vsCMAccess.vsCMAccessPrivate);
cf.AddAttribute("TestMethod", "true");
TextPoint tp = cf.GetStartPoint(vsCMPart.vsCMPartBody);
EditPoint ep = tp.CreateEditPoint();
ep.Indent();
ep.Indent();
ep.Indent();
ep.Insert("string test = Helper.CodeExample();");
}
}
}
你的意思修改C#(文本)文件或C#(.NET)類?修改文本與修改編譯代碼完全不同。 – larsmoa
我的意思是一個C#文本文件。它用於生成測試文件。我可以用StreamWriter做到這一點,但我可能會有更好的方式來做到這一點。 – Mathieu
您需要找到能夠將代碼解析到語法樹中的內容,然後調整該語法樹以添加您的函數,然後從該語法樹生成新文件。 –