在C#中为部分类生成单独的文件
问题描述:
我正在使用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模板做了以下内容:
- 阅读
Database.designer.cs
文件 - 的内容获取所有局部类的列表
- 生成每个班级一个新的文件(
<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();
#>
然后,菲利普Cordas如上所述,在.tst文件生成器,我指定了以下内容:
Template(Settings settings)
{
settings.PartialRenderingMode = PartialRenderingMode.Combined;
}
这导致在有完整的类,我需要的所有属性.ts文件。
这是2017年你为什么仍然使用linq-to-sql? EF代码已经在第一次使用了。 –
这是一个合作项目,这不是我的呼吁......我已经要求摆脱这种现代化。 –
截至2016年12月28日,他们联合支持[paratial](https://github.com/frhagn/Typewriter/issues/127)。 –