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

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

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

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. 为每个类 (<class-name>.cs) 生成一个新文件,其中仅包含以下代码
namespace Name.Space
{
    public partial class SomeClass1
    {
        //
    }
}

这样,打字机将能够读取单个 .cs 文件并生成适当的 .ts 文件。

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

(我尝试过教程,我尝试过代码示例,但我得到的只是头疼和突然想改变我的职业道路的愿望......)

最佳答案

像往常一样,我把它复杂化了。只需将目标 .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();

#>

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

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

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

关于c# - 在 C# 中为部分类生成单独的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44306625/

相关文章:

c# - List<List<int>>的组合

c# - 使用 Linq 执行 SQL 函数

database - Linq to Sql - 多个 .DBML 文件或一个 .DBML 文件

powershell - 如何添加在 Visual Studio 2013 脚手架中使用的新脚手架?

c# - 将命令文本转换为已回答问题中的字符串问题

c# - 使用 IWA 从 Excel 加载项访问 Azure AD

linq-to-sql - 使用 Linq To Sql 的 Upshot 帮助程序扩展

c# - 具有多个文件输出的 T4 嵌套模板

visual-studio - 一次单击即可运行多个T4模板

c# - 分析/优化大量多线程应用程序