2017-08-19 1 views
0

ich eine neue Klasse mit einem VSIX Erstellung dieser Methode:neu erstellte Klasse hat keine Codeclass Element

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; 
} 

Und der Code, der wie folgt aussieht erstellt:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace LightSwitchApplication 
{ 
    class ControlsClass 
    { 
    } 
} 

jedoch Wenn ich versuche, die CodeClass mit ControlsClass verbunden zu bekommen, scheint es, dass es überhaupt nicht im Modell aus irgendeinem Grund überhaupt da ist.

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. 

Ich erwarte die CodeClass dort zu finden, aber bei meiner Überraschung ist das, was ich bekam:

vsCMElementImportStmt (x5)

vsCMElementNamespace

Wo ist die vsCMElementClass? Mache ich das falsch?

Antwort

0

Es stellte sich heraus, die Antwort war ziemlich offensichtlich; die Codeelemente sind baumartig und die Elemente immer etwa so:

var elements = csClass.FileCodeModel.CodeElements; 

wird die erste „Schicht“ von Elementen nur zurückkehren, weshalb ich alle Importe bekam und den Namespace. die CodeNamespace von dort nach dem Aufstehen, alles, was erforderlich war, dass Element Kinder zu bekommen:

CodeElements namespaceChildren = codeNamespace.Children; 

wo codeNamespace die letzten CodeElement von elements (in meinem Szenario) ist.

Verwandte Themen