Как получить свойства базового класса в T4, используя пространство имен envDTE?

Я создал этот вопрос, объясняя шаги, которые я предпринял в качестве ссылки, так как мой поиск занял очень много времени, не зная, где и как найти это решение.

Я создаю шаблон T4 в своем проекте бизнес-логики для создания некоторых классов на основе существующего класса в другом проекте (то же решение), что и в моем шаблоне T4. Я уже загрузил включение VisualStudioHelper из материальной галереи шаблонов. Это очень помогло получить класс (ы) сущностей из моего Entity-Project.

Project targetProject= VisualStudioHelper.GetProject("ProjectName");

Оттуда я получил свой класс:

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

CodeClass targetClass= allClasses
        .Cast<CodeClass>()
        .Where(p => p.Name == "ClassName")
        .Single();

Теперь у меня есть свой класс, где я могу запросить свои свойства:

var allProperties = VisualStudioHelper.CodeModel.GetAllCodeElementsOfType(targetClass.Members, EnvDTE.vsCMElement.vsCMElementProperty, true);

Я обнаружил (очевидно), что свойства базового класса не зарегистрированы как свойства целевого элемента CodeClass.

Может кто-нибудь помочь мне запросить свойства базового класса для моего шаблона T4.

Как объяснено, T4 находится на моем уровне бизнес-логики (BLL), целевые классы сущностей находятся в общем проекте Entity, так как я использовал EF-CodeFirst, где мои сущности точно такие же в моей BLL, как и в моем DAL. Базовые классы взяты из проекта Common Library (Nuget), который я написал сам, содержащий свойства для каждой сущности, которую я использую при использовании EF-CodeFirst.

Слой программного обеспечения

Надеюсь, кто-нибудь может мне помочь.

С уважением, Луук Крийнен

1 ответ

Я вижу, у вас есть VisualStudioHelper, вам может понадобиться добавить в него метод, подобный GetAllMethods.

Вот мой код:

public IEnumerable<EnvDTE.CodeProperty> GetAllProperties(EnvDTE.CodeClass codeClass)
{
    var props = new List<EnvDTE.CodeProperty>();

    props.AddRange(GetProperties(codeClass));
    var baseClass = GetBaseClass(codeClass);
    if (baseClass != null)
        props.AddRange(GetAllProperties(baseClass));

    return props.Distinct(new CodePropertyEqualityComparer());
}

public IEnumerable<EnvDTE.CodeProperty> GetProperties(EnvDTE.CodeClass codeClass)
{
    return GetAllCodeElementsOfType(codeClass.Members, EnvDTE.vsCMElement.vsCMElementProperty, true).OfType<EnvDTE.CodeProperty>();
}
Другие вопросы по тегам