正在从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(它可以在解决方案中的另一个程序集中)?

正在从CodeAttribute内的参数获取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);