Как получить свойства базового класса в 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>();
}