2017-06-01 73 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文件。

相关问题