我有一个模板,可以从数据库中读取需要生成的表和对象。没有问题,模板确实在cs文件中单独生成相关文件(很棒)我使用TemplateFileManager2.1来实现它。在这个表循环中,我想调用另一个模板,使用循环中的tablename创建该表所需的接口,并将该接口放在另一个文件中。
foreach (var table in tables)
{
if(table.name !="sysdiagrams")
{
var manager2 = TemplateFileManager.Create(this);
manager2.StartNewFile(table.name+"mm.cs","Generator","Deneme");
InterfaceGeneratora(table.name);
manager2.Process();
manager2=null;
manager.StartNewFile(table.name+".cs","Generator","GeneratedTables");
这里manager对象用于输出表类,manager2用于接口。这里的poit是在调用manager2和InterfaceGeneratora(table.name)时;运行manager2开始用新表intefarce替换创建的表接口,最后我创建了所有表类,但我手头上只有最后一个表接口。任何帮助表示赞赏。
答案 0 :(得分:6)
据我所知,模板文件管理器替换了.Process()方法中所有以前生成的输出文件。所以你应该在模板的最后调用.Process()方法。
为了“外包”生成接口文件的代码,您可以
在同一模板中使用方法
foreach(var table in tables)
{
if (table.name != "sysdiagrams")
{
manager.StartNewFile(table.name+"mm.cs", ...);
// create interface code
}
manager.StartNewFile(table.name, ...);
// create object code
}
manager.Process();
使用包含通过<#@ include#>生成界面代码的方法的可包含模板指令
<#@ include file="interfaces.ttinclude" #>
foreach(var table in tables)
{
if (table.name != "sysdiagrams")
Interfacegeneratora(table.Name, manager);
// generate object code
manager.StartNewFile(table.name, ...);
// generate object code here
}
manager.Process();
文件“interfaces.ttinclude”包含类似
的内容<#+ void Interfacegeneratora(string tableName, TemplateFileManager manager)
{
manager.StartNewFile(tableName + "mm.cs", ...);
// generate interface code
}
#>
手动处理另一个模板
foreach(var table in tables)
{
if (table.name != "sysdiagrams")
{
var InterfaceT4 = new InterfaceTemplate();
InterfaceT4.Session = new Dictionary<string, object>();
InterfaceT4.Session.Add("tableName", table.name);
InterfaceT4.Session.Add("manager", manager);
InterfaceT4.InitializeSession();
InterfaceT4.ProcessTemplate();
}
manager.StartNewFile(table.Name, ...);
// generate object code
}
manager.Process();
创建另一个名为“InterfaceTemplate.tt”的T4模板,该模板是预处理模板。这实现了与.ttinclude文件相同的代码。
注意:代码不会经过双重检查,但会显示它应该如何工作。
希望有所帮助, 尼科