目录中的 T4 模板
T4 Template inside Directory
我的解决方案中有一个名为“XMLClassGenerator”的 Class 库(Visual studio解决方案文件夹)名为 "HelperModules".
“XMLClassGenerator”模块有一个 T4 Template
扫描整个解决方案(我有大约 23 class 不同解决方案文件夹中的库)以“config.xml”结尾并生成 classes 来操作 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]
returns 为空。
但是如果我将 XMLClassGenerator 模块移动到解决方案根 一切正常。
如何在 XMLClassGenerator 模块位于解决方案文件夹中时获得相同的行为。
问题是foreach (Project project in 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;
}
我的解决方案中有一个名为“XMLClassGenerator”的 Class 库(Visual studio解决方案文件夹)名为 "HelperModules".
“XMLClassGenerator”模块有一个 T4 Template
扫描整个解决方案(我有大约 23 class 不同解决方案文件夹中的库)以“config.xml”结尾并生成 classes 来操作 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]
returns 为空。
但是如果我将 XMLClassGenerator 模块移动到解决方案根 一切正常。
如何在 XMLClassGenerator 模块位于解决方案文件夹中时获得相同的行为。
问题是foreach (Project project in 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;
}