0

我创建了这个问题,解释了我作为参考所采取的步骤,因为我的搜索花了很长时间,不知道在哪里以及如何找到这个解决方案。

我正在我的业务逻辑项目中创建一个 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) 中,目标实体类位于一个常见的实体项目中,因为我使用了 EF-CodeFirst,其中我的 BLL 中的实体与 DAL 中的实体完全相同。基类来自我自己编写的公共库项目 (Nuget),其中包含我在使用 EF-CodeFirst 时使用的每个实体的属性。

软件分层

希望可以有人帮帮我。

亲切的问候, Luuk Krijnen

4

1 回答 1

0

我看到你有 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>();
}
于 2017-02-08T03:07:44.070 回答