2013-04-24 2 views
10

Chciałbym uzyskać listę wszystkich publicznych metod w moim projekcie, które są ozdobione przy użyciu MyAttribute przy użyciu T4/EnvDTE.Uzyskaj wszystkie metody, które są ozdobione określonym atrybutem za pomocą T4/EnvDTE

Wiem, że można to zrobić za pomocą refleksji, ale nie chcę ładować zespołu i zastanawiać się nad nim w szablonie T4, a raczej chcę użyć istniejących plików kodu jako źródła.

Poniżej boilerplate kod znalazłem w internecie, że Pobiera odwołanie do aktualnego projektu

<#@ template debug="true" hostspecific="true" language="C#" #> 
<#@ assembly name="EnvDTE" #> 
<#@ assembly name="System.Core.dll" #> 
<#@ import namespace="System.Linq" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ import namespace="System.IO" #> 
<#@ output extension=".cs" #> 

<# 
    IServiceProvider _ServiceProvider = (IServiceProvider)Host; 
    if (_ServiceProvider == null) 
     throw new Exception("Host property returned unexpected value (null)"); 

    EnvDTE.DTE dte = (EnvDTE.DTE)_ServiceProvider.GetService(typeof(EnvDTE.DTE)); 
    if (dte == null) 
     throw new Exception("Unable to retrieve EnvDTE.DTE"); 

    Array activeSolutionProjects = (Array)dte.ActiveSolutionProjects; 
    if (activeSolutionProjects == null) 
     throw new Exception("DTE.ActiveSolutionProjects returned null"); 

    EnvDTE.Project dteProject = (EnvDTE.Project)activeSolutionProjects.GetValue(0); 
    if (dteProject == null) 
     throw new Exception("DTE.ActiveSolutionProjects[0] returned null"); 

#> 

Odpowiedz

13

Chciałbym potwierdzić swój zamiar używać EnvDTE zdobyć informacje czas projektowania o klasach Twojego projektu i metody. Moim zdaniem jest to bardziej wiarygodne niż ryzyko odzwierciedlające przestarzały montaż tego samego projektu.

Ponieważ masz już bieżący projekt swojego rozwiązania, powinieneś teraz użyć Visual Studio CodeModel do iteracji twoich zajęć i ich metod itp. Wiem, że to może być dość denerwujące, ale znalazłem darmowy szablon wielokrotnego użytku .ttinclude, który zapewnia ci metody ułatwiające dostęp do CodeModel. Możesz sprawdzić numer tangible's T4 Editor. Jest bezpłatny i jest dostarczany z bezpłatną galerią szablonów, która zawiera jedną z nazwanych "namacalnych Visual Studio Automation Helper". Przy użyciu tego szablonu wynikowy kod może wyglądać następująco:

<# 
// get a reference to the project of this t4 template 
var project = VisualStudioHelper.CurrentProject; 

// get all class items from the code model 
var allClasses = VisualStudioHelper.GetAllCodeElementsOfType(project.CodeModel.CodeElements, EnvDTE.vsCMElement.vsCMElementClass, false); 

// iterate all classes 
foreach(EnvDTE.CodeClass codeClass in allClasses) 
{ 
    // get all methods implemented by this class 
    var allFunctions = VisualStudioHelper.GetAllCodeElementsOfType(codeClass.Members, EnvDTE.vsCMElement.vsCMElementFunction, false); 
    foreach(EnvDTE.CodeFunction function in allFunctions) 
    { 
     // get all attributes this method is decorated with 
     var allAttributes = VisualStudioHelper.GetAllCodeElementsOfType(function.Attributes, vsCMElement.vsCMElementAttribute, false); 
     // check if the System.ObsoleteAttribute is present 
     if (allAttributes.OfType<EnvDTE.CodeAttribute>() 
         .Any(att => att.FullName == "System.ObsoleteAttribute")) 
     { 
     #><#= function.FullName #> 
<#   
     } 
    } 
} 
#> 
+0

Nie widzę "namacalnego programu Visual Studio Automation Helper" na liście szablonów VS. – Omar

+0

Widzę to teraz. Musisz otworzyć plik '.tt', w którym pojawi się menu' Tangible T4' z menu standardowym. To pierwszy element menu. Pozwól mi to zrobić. – Omar

+2

Widzę Visual Studio Automation Helper w szablonie Gallary, ale nie ma odniesienia do VisualStudioHelper w dowolnym miejscu. Istnieje klasa o nazwie DteHelper, ale nie ma metod wskazanych w twoim przykładzie, takich jak GetAllCodeElementsOfType. –

Powiązane problemy