2013-01-15 10 views
9

Mam problem z utworzeniem sposobu wyświetlania wszystkich klas w moim projekcie przy użyciu EnvDTE dla szablonów interfejsów przy użyciu T4 (w oparciu o konwencje nazewnictwa) i żadnej z dokumentacji wydaje się, że opisują, jak to zrobić. Zacząłem z:Zbierz listę klas użytkowników w projekcie za pomocą EnvDTE

<#@ template debug="true" hostspecific="true" language="C#" #> 
<#@ output extension=".cs" #> 
<#@ Assembly name="EnvDTE" #> 
<#@ Assembly name="System.Core" #> 
<#@ import namespace="EnvDTE" #> 
<#@ Import Namespace="System.Linq" #> 
<#@ Import Namespace="System.Collections.Generic" #> 
<# 
    var env = (DTE)((IServiceProvider)this.Host) 
     .GetService(typeof(EnvDTE.DTE)); 

... a potem zacząłem chodzić na boki. Jestem w stanie zidentyfikować mój projekt, ale nie jestem w stanie zebrać klas w projekcie, które chcę filtrować na płaską listę do tworzenia interfejsów.

Jak mogę to zrobić? Chcę tylko zajęć w moim projekcie.

+0

Zakładam, że to jest Visual Studio. Jeśli tak, to czy w ogóle spojrzałeś na Roslyn? – Ameen

+2

Spójrz na moją odpowiedź tutaj http://stackoverflow.com/a/6572941/157224 o znajdowaniu klas z DTE – adrianm

+0

@adrianm, wygląda na to, że może być to czego szukam (raz przetłumaczyć na C#) ... Spróbuję tego rano. –

Odpowiedz

10

Ponieważ używasz T4 proponuję sprawdzić tangible T4 Editor. W ich galerii znajduje się darmowy szablon wielokrotnego użytku "namacalny program Visual Studio Automation Helper". Za pomocą tego szablonu można łatwo znaleźć klasy kodu itp. (Zobacz moją odpowiedź na ten post Design Time Reflection).

Jeśli chcesz zrobić to na własną rękę należy kontynuować tak:

var project = env.ActiveDocument.ProjectItem.ContainingProject; 
foreach(EnvDTE.CodeElement element in project.CodeModel.CodeElements) 
{ 
    if (element.Kind == EnvDTE.vsCMElement.vsCMElementClass) 
    { 
     var myClass = (EnvDTE.CodeClass)element; 
     // do stuff with that class here 
    } 
} 

usunąłem rekursji, które byłyby konieczne. CodeElement może zawierać inne CodeElements. Ale w ten sposób łatwiej jest czytać.

0

nie wiem za dużo o szablonów T4, ale można użyć Reflection w jednym dostać klasie za

Np

<#@ template debug="true" hostspecific="true" language="C#" #> 
<#@ output extension=".cs" #> 
<#@ Assembly name="EnvDTE" #> 
<#@ Assembly name="System.Core" #> 
<#@ import namespace="EnvDTE" #> 
<#@ Import Namespace="System.Linq" #> 
<#@ Import Namespace="System.Collections.Generic" #> 
<#@ Import Namespace="System.Reflection" #> 
<# 

    var list = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsClass); 
+0

Odbicie, niestety, zostaje rozbudzone, gdy próbuje się samemu zastanowić. Przechowuje dane w pamięci podręcznej i niekoniecznie aktualizuje się po zmianie kodu. –

+0

Czy to tylko w szablonie T4, bo nigdy nie widziałem tego problemu przed –

+0

Tak, prawie. –

Powiązane problemy