2017-06-01 105 views
2

我正在使用MSLinqToSQLGenerator生成反映數據庫的部分類的項目。它生成一個單獨的文件(Database.designer.cs),其中包含許多反映表和存儲過程以及不相關的部分類。在C#中爲部分類生成單獨的文件

Database.designer.cs文件基本上是這樣的:

namespace Name.Space 
{ 
    public partial class SomeClass1 
    { 
     // stuff 
    } 

    public partial class SomeClass2 
    { 
     // stuff 
    } 

    public partial class SomeClass3 
    { 
     // stuff 
    } 
} 

目前,該項目的另一部分使用打字機擴展Visual Studio來從自動生成的類文件打字稿。現在,打字機工作在一個文件到一個文件的原則,這意味着我不能將一個.cs文件中的多個類分隔成單獨的.ts文件(這是我所需要的,本質上)。

所以我想到了用T4模板做了以下內容:

  1. 閱讀Database.designer.cs文件
  2. 的內容獲取所有局部類的列表
  3. 生成每個班級一個新的文件( <class-name>.cs)僅包含以下代碼
namespace Name.Space 
{ 
    public partial class SomeClass1 
    { 
     // 
    } 
} 

這樣,打字機將能夠讀取單個.cs文件並生成適當的.ts文件。

我需要的是特定的T4代碼來讀取Database.designer.cs文件並將每個類輸出到它自己的文件。

(我試過教程,我已經試過代碼示例和所有我得到的是頭痛,突然想改變我的職業生涯路徑...)

+0

這是2017年你爲什麼仍然使用linq-to-sql? EF代碼已經在第一次使用了。 –

+0

這是一個合作項目,這不是我的呼籲......我已經要求擺脫這種現代化。 –

+0

截至2016年12月28日,他們聯合支持[paratial](https://github.com/frhagn/Typewriter/issues/127)。 –

回答

1

像往常一樣,我過於複雜了。這是一個將目標.cs文件作爲File對象打開,通過行讀取並簡單地提取必要的類名稱的問題。這是我在網上找到的幾篇文章(我不記得的各種資料)的組合,以及來自Tangible T4 TemplateFileManagerV2.1.ttinclude的組件。

<#@ template debug="true" hostSpecific="true" #> 
<#@ output extension=".cs" #> 
<#@ include file="TemplateFileManagerV2.1.ttinclude" #> 
<#@ Assembly Name="System.Core" #> 
<#@ Assembly Name="System.Windows.Forms" #> 
<#@ assembly name="EnvDTE" #> 
<#@ import namespace="System" #> 
<#@ import namespace="System.IO" #> 
<#@ import namespace="System.Diagnostics" #> 
<#@ import namespace="System.Linq" #> 
<#@ import namespace="System.Collections" #> 
<#@ import namespace="System.Collections.Generic" #> 
<#@ import namespace="EnvDTE" #> 
<# 
    string absolutePath = Host.ResolvePath("..\\Database.designer.cs"); 
    string[] contents = File.ReadAllLines(absolutePath); 

    List<string> selectedContent = new List<string>(); 
    string[] separators = new string[] { " " }; 

    foreach (var csFileRow in contents) 
    { 
     if (csFileRow.Contains("public partial class")) 
     { 
      var tmpSplit = csFileRow.Split(' '); 
      var tmpString = tmpSplit[3]; // public partial class <targetClassName> (4th member) 

      if (tmpString.Contains("Result")) // Example: SearchRolesResult 
      { 
       selectedContent.Add(tmpString); 
      } 
     } 
    } 

    var manager = TemplateFileManager.Create(this); 
#> 
<# 
    foreach (var classItem in selectedContent) 
    { 
     manager.StartNewFile(classItem + ".cs"); 
#> 
namespace Name.Space 
{ 
    public partial class <#= classItem #> 
    { 
    } 
} 

<# 
     manager.EndBlock(); 
    } 
    manager.Process(); 

#> 

然後,菲利普Cordas如上所述,在.tst文件生成器,我指定了以下內容:

Template(Settings settings) 
{ 
    settings.PartialRenderingMode = PartialRenderingMode.Combined; 
} 

這導致在有完整的類,我需要的所有屬性.ts文件。

相關問題