.net - 目录内的 T4 模板

标签 .net visual-studio visual-studio-2013 t4

我的解决方案中有一个名为“XMLClassGenerator”的类库,位于名为“HelperModules”的文件夹(Visual studio 解决方案文件夹)内。

XMLClassGenerator”模块,它有一个T4 Template,它扫描整个解决方案(我在不同的解决方案文件夹中有大约 23 个类库)以查找结尾为的文件“config.xml”并生成类来操作 XML 数据,而无需硬编码键。

疑似T4模板代码

    var hostServiceProvider = (IServiceProvider)this.Host;
    var dte = (DTE)hostServiceProvider.GetService(typeof(DTE));


    foreach (Project project in dte.Solution)
    {
       var items =    ((Project)project).ProjectItems.GetEnumerator();;
       while (items.MoveNext())
       {
          var item = (ProjectItem)items.Current;
          //Recursion to get all ProjectItems
          projectItems.Add(GetFiles(item));
       }
    }

    string GetFiles(ProjectItem item)
    {
        var itemFullPath = string.Empty;

        int g = item.FileCount;

        if (item.FileCount > 0)
            itemFullPath = item.FileNames[1];

      ....
      .... 
    }

item.FileNames[1] 在我当前的设置中返回 null。

但是,如果我将 XMLClassGenerator 模块移至解决方案根目录一切都会完美运行

XMLClassGenerator 模块位于解决方案文件夹内时如何获得相同的行为。

最佳答案

问题是 foreach(dte.Solution 中的项目项目) 迭代解决方案中的子文件夹而不是解决方案中的实际项目

因此获取项目列表的代码应如下所示

    private List<Project> GetAllProjects()
    {
        List<Project> lst = new List<Project>();

        var hostServiceProvider = (IServiceProvider)this.Host;
        var DTE = (DTE)hostServiceProvider.GetService(typeof(DTE));

        foreach (Project proj in DTE.Solution.Projects) {
            if (proj.Kind == Constants.vsProjectKindSolutionItems) {
                lst.AddRange(GetSubProjects(proj.ProjectItems));
            } else {
                lst.Add(proj);
            }
        }
        return lst;
    }

    private List<Project> GetSubProjects(ProjectItems pis)
    {
        List<Project> lst = new List<Project>();
        foreach (ProjectItem pi in pis) {
            if (pi.Kind == Constants.vsProjectItemKindSolutionItems) {
                lst.Add(pi.SubProject);
            } else if (pi.Kind == Constants.vsProjectKindSolutionItems) {
                lst.AddRange(GetSubProjects(pi.ProjectItems));
            }
        }
        return lst;
    }   

关于.net - 目录内的 T4 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33471905/

相关文章:

c# - 用于处理大数据量(100 万条记录等)的数据结构和技术

c# - 从在 ITemplate 中动态创建的 ImageButton 触发 RowCommand 事件

C# .NET 套接字连接问题 - 通常只允许每个套接字地址使用一次

visual-studio - Visual Studio错误: An item with the same key has already been added

c++ - vs2013 : static member does not link

c# - 串口通讯积累了大量正在运行的线程

.net - 一旦用户对 datagridview 进行排序,我如何取回原始行索引?

.net - Nuget:将多个大型解决方案迁移到 PackageReference

c# - if 语句在一行上,其中包含 html

iis - Visual Studio 2013 : Unable to access IIS metabase