gpt4 book ai didi

c# - 使用 T4/EnvDTE 获取所有用特定属性修饰的方法

转载 作者:可可西里 更新时间:2023-11-01 08:42:33 29 4
gpt4 key购买 nike

我想获取项目中使用 T4/EnvDTE 使用 MyAttribute 修饰的所有公共(public)方法的列表。

我知道这可以通过反射来完成,但我不想加载程序集并在 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 获取有关项目类和方法的设计时信息的计划。在我看来,这比冒险反射(reflect)同一项目的过时程序集更可靠。

由于您已经获得了解决方案的当前项目,因此您现在应该使用 Visual Studio CodeModel迭代您的类及其方法等。我知道这可能很烦人,但我发现了一个免费的可重复使用的 .ttinclude 模板,它为您提供了简化对 CodeModel 的访问的方法。您可能想查看 tangible's T4 Editor .它是免费的,并附带一个免费的模板库,其中包含一个名为“有形的 Visual Studio Automation Helper”的模板库。使用此模板,您生成的代码可能如下所示:

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

关于c# - 使用 T4/EnvDTE 获取所有用特定属性修饰的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16197422/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com