从CodeAttribute中的参数获取CodeClass?

时间:2011-06-21 18:57:59

标签: c# code-generation t4

我正在开发一些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(可以在解决方案中的另一个程序集内)?

1 个答案:

答案 0 :(得分:2)

根据William的回复,您只能使用设计时信息,该信息将是传递给该属性的未解析文本。如果您有兴趣在不使用递归的情况下查找 typeof 关键字中引用的CodeClass,则可以使用tangible's T4 Editor模板库中的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);