在C#中为部分类生成单独的文件

时间:2017-06-01 11:44:35

标签: c# linq-to-sql t4 auto-generate typewriter

我正在开发一个使用MSLinqToSQLGenerator生成反映数据库的部分类的项目。它生成一个单独的文件(Database.designer.cs),其中包含许多反映表和存储过程等的部分类。

Database.designer.cs文件基本上是这样的:

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

    public partial class SomeClass2
    {
        // stuff
    }

    public partial class SomeClass3
    {
        // stuff
    }
}

现在,该项目的另一部分使用Visual Studio的Typewriter扩展来自动生成类中的Typescript文件。现在,Typewriter工作在一个文件到一个文件的原则上,这意味着我不能将一个.cs文件中的多个类分成单独的.ts文件(这实际上就是我所需要的)。

所以我想到使用T4模板来做以下事情:

  1. 阅读Database.designer.cs档案
  2. 的内容
  3. 获取所有部分类的列表
  4. 为每个只包含以下代码的类(<class-name>.cs)生成一个新文件
  5. namespace Name.Space
    {
        public partial class SomeClass1
        {
            //
        }
    }
    

    这样,打字机就能读取单个.cs文件并生成相应的.ts文件。

    我需要的是特定的T4代码来读取Database.designer.cs文件并将每个类输出到自己的文件。

    (我已经尝试过教程,我已经尝试过代码示例,而我所得到的只是一个令人头疼的事情,突然想改变我的职业道路......)

1 个答案:

答案 0 :(得分:1)

像往常一样,我过于复杂了。这是将目标.cs文件作为File对象打开,按行读取并简单地提取必要的类名称的问题。这是我在网上发现的几个帖子(我不记得的各种来源)和来自有形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();

#>

然后,正如上面提到的Filip Cordas,在.tst文件生成器中,我指定了以下内容:

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

导致.ts文件完成了包含我需要的所有属性的类。