我想获得在我的项目中的所有公用方法,使用饰列表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");
#>
我想确认你计划使用EnvDTE获得有关项目的类和方法设计时信息。 在我看来,这比冒险,以反映同一个项目的一个过时的装配更可靠。
既然你已经得到了你的解决方案的当前项目,你现在应该使用Visual Studio的CodeModel迭代类和它们的方法等。我知道这可能是烦了,但我发现了一个免费的可重复使用的模板.ttinclude提供您与方法缓解在访问CodeModel。 你可能想看看有形的T4编辑器 。 它是免费的,并附带包含一个名为“有形的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 #>
<#
}
}
}
#>
文章来源: Get all methods that are decorated with a specific attribute using T4/EnvDTE