为了让 自动产生的代码 和 程序员手写的代码 互不干涉, 提出了Merge策略, 包括以下三种

InsertRegion: 只插入(覆盖)到指定 #region区域
InsertClass: 覆盖class, 我没试过
PreserveRegions: 对某些符合正则表达式的 #region区域, 不覆盖

 

下面是我的操作流程(使用 CodeSmith Generator 7 的 TemplateEditor.exe), 大家参考一下吧

 

1. 要使用Merge策略, 就必须使用 CodeSmith Generator Project(代码生成项目), 在My Templates文件夹上右击  -->  New  --> CodeSmith Generator Project, 命名为mergeTest.csp 吧

CodeSmith Merge策略--小白教程-LMLPHP

 

2. 然后创建一个CSharp模板, 比如merge1.cst, 功能很简单, 就是输出两个变量

<%@ Template Language="C#" TargetLanguage="C#" %>
<%@ Property Name="SampleStringProperty" Default="SomeValue" Type="System.String" %>
<%@ Property Name="SampleBooleanProperty" Default="True" Type="System.Boolean" %>
SampleStringProperty= <%= SampleStringProperty %>
SampleBooleanProperty= <%= SampleBooleanProperty %>

 

3. 准备一个含有手写代码的目标文件, 命名成merge1.cs, 里面 #region output_here 就是要覆盖的区域

把这个文件就放在 My Templates文件里面, 但你并不会马上从Template Explorer里看到, 重启 CodeSmith就可以看见了

//这些区域不会被覆盖

#region output_here
//这里面填写什么, 都会被覆盖掉
#endregion //这些区域也不会被覆盖

 

4. 右击mergeTest.csp --> Add Output:

Template选择 merge1.cst

File就是要覆盖的文件, 选择刚才创建的merge1.cs

Merge里的 Type 这次选 InsertRegion

下面的Initialization string, 没找到帮助文档, 照着例子写, RegionName=output_here, 表示要覆盖的region叫output_here

CodeSmith Merge策略--小白教程-LMLPHP

 

5. 右击mergeTest.csp -->Generate Outputs, 就开始执行mergeTest.csp项目里面的各种输出模板了

6. 再次双击merge1.cs 就可以看到结果了

//这些区域不会被覆盖

#region output_here
SampleStringProperty= SomeValue
SampleBooleanProperty= True #endregion //这些区域也不会被覆盖

 

至于Merge策略PreserveRegions, 主要的难点还是Initialization string

比如CodeSmith Generator 7.0 Samples --> Examples  --> Merge --> CSharp 里PreserveRegionsSample.cst就是

RegionNameRegex=^[ \t]*[ \s]*"?(?i:Custom)"?;

意思在 新一行里找到含有Custom这个关键字的region, 就不要覆盖

05-08 15:30