正在从CodeAttribute内的参数获取CodeClass
本文关键字:参数 获取 CodeClass CodeAttribute | 更新日期: 2023-09-27 18:00:00
我正在生成一些T4代码,为此我需要在BarAttribute的构造函数内部传递的类型的CodeClass。
class Baz { }
class Bar : Attribute { public Bar (Type type) { } }
[Bar(typeof(Baz))]
public class Foo
{
}
到目前为止,这就是我的T4模板中的内容,我只将CodeAttribute"[Bar(typeof(Baz))]"赋予函数:
private CodeClass GetType(CodeElement codeElement)
{
CodeAttribute attribute = (CodeAttribute)codeElement;
if (attribute.Name == "Bar")
{
foreach (CodeElement child in attribute.Children)
{
EnvDTE80.CodeAttributeArgument attributeArg = (EnvDTE80.CodeAttributeArgument)child;
WriteLine(attributeArg.Value);
}
}
return null;
}
函数现在只写:typeof(Baz),我如何在不迭代所有Projects、ProjectItems、CodeElements等的情况下获得Baz的CodeClass(它可以在解决方案中的另一个程序集中)?
根据William的回复,您仅限于设计时信息,该信息将是传递给属性的未解析文本。如果您有兴趣在不使用递归的情况下查找类型的关键字中引用的CodeClass,则可以使用有形的T4编辑器模板库中的VisualStudioAutomationHelper
类。你这样使用它:
var project = VisualStudioHelper.CurrentProject;
var allClasses = VisualStudioHelper.GetAllCodeElementsOfType(project.CodeModel.CodeElements, EnvDTE.vsCMElement.vsCMElementClass, false);
allClasses.Cast<EnvDTE.CodeClass>().Single(x => x.Name == searchedClassName);