CodeSmith 使用教程(8): CodeTemplate对象



在使用代码模板产生代码时,CodeSmith引擎背后使用了不少对象来帮助代码的生成,其中常用的有

  • CodeTempate (类似于Asp.Net的Page类)
  • Progress 用于显示代码生成的进度
  • CodeTemplateInfo 可以返回关于当前模板自身的一些信息。

本篇介绍CodeTemplate ,CodeTemplate代表了由CodeSmith引擎处理的代码模板对象,可以通过CodeTemplate对象直接和CodeSmith引擎交互,比如:

  • 使用 GetFileName 修改模板生成的缺省文件名
  • 使用 Render method 把模板的输出到多个文件中
  • 通过 events 把代码插入到CodeSmith引擎处理模板的过程中。
  • 通过 Response 属性直接在输出文件中写内容。

使用GetFileName修改模板输出的文件名

在前面的例子CodeSmith 使用教程(2): 编写第一个代码模板 我们已经使用GetFileName修改过输出的文件名,比如在你的模板中定义了一个ClassName属性,可以通过GetFileName 把模板输出的缺省文件名改成类名

  1. <%@ Template Language="C#" TargetLanguage="Text" %>  
  2. <%@ Property Name="ClassName" Type="System.String" Default="ClassName" %>  
  3.   
  4. This template shows off how to override the GetFileName method.  
  5.   
  6. <script runat="template">  
  7. public override string GetFileName()  
  8. {  
  9.     return ClassName + ".cs";  
  10. }  
  11. </script>  
<%@ Template Language="C#" TargetLanguage="Text" %>
<%@ Property Name="ClassName" Type="System.String" Default="ClassName" %>

This template shows off how to override the GetFileName method.

<script runat="template">
public override string GetFileName()
{
    return ClassName + ".cs";
}
</script>

重载ParseDefaultValue 方法
在定义属性的缺省值时,有时有些属性的缺省值可能无法从String转换,此时可以通过重载ParseDefaultValue 方法,这个方法会被CodeSmith引擎中处理每个属性时调用,如果你重载了这个方法,可以按照你自己的逻辑来处理属性的缺省值。

重载Render 方法
CodeTemplate的Render方法是CodeSmith引擎生成最终输出时调用的,可以通过重载这个方法来修改输出的内容或是把输出写到多个文件中。
比如下面代码除了生成缺省的输出外,还把输出写到另外两个文件中:

  1. <%@ CodeTemplate Language="C#" TargetLanguage="Text"  
  2.    Description="AddTextWriter Demonstration." %>  
  3. <%@ Import Namespace="System.IO" %>  
  4. //This template demonstrates using the AddTextWriter method  
  5. //to output the template results to multiple locations concurrently.  
  6. <script runat="template">  
  7. public override void Render(TextWriter writer)  
  8.     {  
  9.         StreamWriter fileWriter1 = new StreamWriter(@"test1.txt"true);  
  10.         this.Response.AddTextWriter(fileWriter1);  
  11.   
  12.         StreamWriter fileWriter2 = new StreamWriter(@"test2.txt"true);  
  13.         this.Response.AddTextWriter(fileWriter2);  
  14.   
  15.         base.Render(writer);  
  16.   
  17.         fileWriter1.Close();  
  18.         fileWriter2.Close();  
  19.     }  
  20. </script>  
<%@ CodeTemplate Language="C#" TargetLanguage="Text"
   Description="AddTextWriter Demonstration." %>
<%@ Import Namespace="System.IO" %>
//This template demonstrates using the AddTextWriter method
//to output the template results to multiple locations concurrently.
<script runat="template">
public override void Render(TextWriter writer)
    {
        StreamWriter fileWriter1 = new StreamWriter(@"test1.txt", true);
        this.Response.AddTextWriter(fileWriter1);

        StreamWriter fileWriter2 = new StreamWriter(@"test2.txt", true);
        this.Response.AddTextWriter(fileWriter2);

        base.Render(writer);

        fileWriter1.Close();
        fileWriter2.Close();
    }
</script>

20130105002注意调用基类的base.Render,否则你就不会输出到缺省的文件。本例下载

模板事件

CodeTemplate类定义了下面几个事件,你可以中这些事件发生时添加自动的事件处理.

使用Response对象

和Asp.Net的Page对象一样,可以通过CodeTemplate的Response属性直接在输出流中写入内容。比如

  1. <%@ CodeTemplate Language="C#" TargetLanguage="Text"  
  2. Description="This template demonstrates writing directly to the Response property" %>  
  3. <% RenderDirect(); %>  
  4. <script runat="template">  
  5. public void RenderDirect()  
  6. {  
  7. Response.WriteLine("Written directly to the Response property.");  
  8. Response.WriteLine("Hello " + System.Environment.UserName + "!");  
  9. }  
  10. </script>  
<%@ CodeTemplate Language="C#" TargetLanguage="Text"
Description="This template demonstrates writing directly to the Response property" %>
<% RenderDirect(); %>
<script runat="template">
public void RenderDirect()
{
Response.WriteLine("Written directly to the Response property.");
Response.WriteLine("Hello " + System.Environment.UserName + "!");
}
</script>

直接在输出流中写入两行文字。Response对象的类型为CodeTemplateWriter类 ,常用的方法有:

  • AddTextWriter -添加额外的输出位置
  • Indent – 为输出添加一个缩进
  • Unindent - 为输出减少一个缩进
  • Write -写入内容
  • WriteLine - 写入内容并添加分行符
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值