新创建的类没有CodeClass元素

时间:2017-08-19 03:49:58

标签: c# class project element vsix

我正在使用此方法创建一个带有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
    {
    }
}

但是,当我尝试将CodeClassControlsClass相关联时,由于某种原因,它似乎在模型中根本不存在。

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在哪里?我做错了吗?

1 个答案:

答案 0 :(得分:0)

事实证明答案非常明显; CodeElements是树状的,并获得如下元素:

var elements = csClass.FileCodeModel.CodeElements;

只返回元素的第一个“层”,这就是我得到所有导入和命名空间的原因。从那里获得CodeNamespace之后,所需要的就是获得该元素的子项:

CodeElements namespaceChildren = codeNamespace.Children; 

其中codeNamespace是来自CodeElement的最后一个elements(在我的方案中)。