Получение CodeClass из аргумента внутри CodeAttribute? - PullRequest
3 голосов
/ 21 июня 2011

Я работаю над генерацией кода T4, для этого мне нужен CodeClass типа, который передается внутри конструктора BarAttribute.

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), как я могу получить CodeClass of Baz (который может быть внутри другой сборки в решении) без итерации по всем Projects, ProjectItems, CodeElements и т. Д.?

1 Ответ

2 голосов
/ 08 мая 2013

Согласно ответу Уильяма , вы ограничены информацией времени разработки, которая будет непарсированным текстом, передаваемым атрибуту.Если вы заинтересованы в том, чтобы найти кодовый класс, на который ссылается ключевое слово typeof , не прибегая к рекурсии, вы можете использовать класс VisualStudioAutomationHelper, найденный в T4 Editor шаблонной галерее.Вы используете это так:

var project = VisualStudioHelper.CurrentProject;

var allClasses = VisualStudioHelper.GetAllCodeElementsOfType(project.CodeModel.CodeElements, EnvDTE.vsCMElement.vsCMElementClass, false);

allClasses.Cast<EnvDTE.CodeClass>().Single(x => x.Name == searchedClassName);
...