2013-04-24 20 views
10

Ich möchte eine Liste aller öffentlichen Methoden in meinem Projekt erhalten, die MyAttribute mit T4/EnvDTE sind dekoriert mit.alle Methoden erhalten, die mit einem bestimmten Attribut T4 eingerichtet/EnvDTE

Ich weiß, dass dies mit Reflektion getan werden kann, aber ich möchte die Baugruppe nicht laden und darüber in einer T4-Vorlage reflektieren, sondern ich möchte die vorhandenen Codedateien als Quelle verwenden.

Nachfolgend ist vorformulierten Code, den ich im Internet gefunden, die einen Verweis auf das aktuelle Projekt

<#@ 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"); 

#> 

Antwort

13

bekommen würde Ich mag Ihren Plan bestätigen EnvDTE verwenden Design Zeit-Informationen über Ihr Projekt Klassen zu gewinnen und Methoden. Meiner Meinung nach ist es zuverlässiger als das Risiko, eine veraltete Versammlung desselben Projekts zu reflektieren.

Da Sie bereits das aktuelle Projekt Ihrer Lösung haben, sollten Sie jetzt die Visual Studio CodeModel verwenden, um Ihre Klassen und ihre Methoden etc. zu wiederholen. Ich weiß, dass dies ziemlich ärgerlich sein kann, aber ich fand eine kostenlose wiederverwendbare .ttinclude Vorlage Methoden, die den Zugriff auf das CodeModel erleichtern. Vielleicht möchten Sie tangible's T4 Editor überprüfen. Es ist kostenlos und wird mit einer kostenlosen Vorlagengalerie geliefert, die einen "greifbaren Visual Studio-Automatisierungshelfer" enthält. Unter Verwendung dieser Vorlage könnte der resultierende Code wie folgt aussehen:

<# 
// 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

Ich sehe nicht "greifbare Visual Studio Automation Helper" in VS Vorlagen Liste. – Omar

+0

Ich sehe es jetzt. Sie müssen eine '.tt' Datei öffnen, an welcher Stelle ein' Tangible T4' Menü mit den Standardmenüs erscheint. Es ist der erste Menüpunkt. Lass mich das mal versuchen. – Omar

+2

Ich kann Visual Studio Automation Helper in der Vorlage Gallary sehen, aber es gibt keinen Verweis auf VisualStudioHelper. Es gibt eine Klasse namens DteHelper, aber sie hat nicht die Methoden, die in Ihrem Beispiel angegeben sind, wie GetAllCodeElementsOfType. –