Получить все методы, которые украшены определенным атрибутом, используя T4/EnvDTE

Я хотел бы получить список всех открытых методов в моем проекте, которые оформлены с использованием MyAttribute используя T4/EnvDTE.

Я знаю, что это можно сделать с помощью отражения, но я не хочу загружать сборку и отражать ее в шаблоне T4, скорее, я хочу использовать существующие файлы кода в качестве источника.

Ниже приведен шаблонный код, который я нашел в интернете и который получает ссылку на текущий проект.

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

#>

1 ответ

Решение

Я хотел бы подтвердить ваш план использования EnvDTE для получения во время разработки информации о классах и методах вашего проекта. На мой взгляд, это более надежно, чем рисковать, чтобы отразить устаревшую сборку того же проекта.

Поскольку у вас уже есть текущий проект вашего решения, теперь вы должны использовать Visual Studio CodeModel для итерации ваших классов, их методов и т. Д. Я знаю, что это может быть довольно раздражающим, но я нашел бесплатный многократно используемый шаблон.ttinclude, который предоставляет вам методы, облегчающие доступ к CodeModel. Возможно, вы захотите проверить T4 Editor. Это бесплатно и поставляется с бесплатной галереей шаблонов, которая содержит один с именем "ощутимый помощник по автоматизации Visual Studio". Используя этот шаблон, ваш полученный код может выглядеть так:

<#
// 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 #>
<#          
        }
    }
}
#>
Другие вопросы по тегам