Получить все методы, которые украшены определенным атрибутом, используя 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 #>
<#
}
}
}
#>