我正在使用此方法创建一个带有vsix的新类:
private static ProjectItem AddCSClass(DTE2 dte, Project project, string className)
{
Solution2 solution = (Solution2)dte.Application.Solution;
string itemPath = solution.GetProjectItemTemplate("Class.zip", "CSharp");
try
{
project.ProjectItems.AddFromTemplate(itemPath, className + ".cs");
} catch (COMException ex)
{
// File already exists
}
ProjectItem csClass = null;
IEnumerator enumerator = project.ProjectItems.GetEnumerator();
while (enumerator.MoveNext())
{
ProjectItem currentItem = (ProjectItem)enumerator.Current;
if (currentItem.Name.Equals(className + ".cs"))
{
csClass = currentItem;
break;
}
}
return csClass;
}
创建的代码如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LightSwitchApplication
{
class ControlsClass
{
}
}
但是,当我尝试将CodeClass
与ControlsClass
相关联时,由于某种原因,它似乎在模型中根本不存在。
ProjectItem csClass = AddCSClass((DTE2)document.DTE, project, "ControlsClass");
if (csClass == null) { return; }
var elements = csClass.FileCodeModel.CodeElements;
List<CodeElement> codeElements = new List<CodeElement>();
foreach (CodeElement ce in elements) { Debug.WriteLine(ce.Kind); codeElements.Add(ce); }
IEnumerable<CodeClass> csClassClasses = codeElements.Where(ce => ce.Kind == vsCMElement.vsCMElementClass).Cast<CodeClass>();
if (csClassClasses.Count() != 1) { return; } // TODO: Maybe throw an exception, file altered.
我期待在那里找到CodeClass
,但令我惊讶的是这就是我得到的:
vsCMElementImportStmt(x5)
vsCMElementNamespace
vsCMElementClass
在哪里?我做错了吗?
答案 0 :(得分:0)
事实证明答案非常明显; CodeElements是树状的,并获得如下元素:
var elements = csClass.FileCodeModel.CodeElements;
只返回元素的第一个“层”,这就是我得到所有导入和命名空间的原因。从那里获得CodeNamespace
之后,所需要的就是获得该元素的子项:
CodeElements namespaceChildren = codeNamespace.Children;
其中codeNamespace
是来自CodeElement
的最后一个elements
(在我的方案中)。