使用T4模板创建一个例子

1、创建项目,添加新项,名称处填写Messages.tt,如下图:

添加后,Messages.tt文件内容如下:

1 <#@ template debug="false" hostspecific="false" language="C#" #>
2 <#@ output extension=".txt" #>

2、创建一个实体对象MessageEntry,用以传递模版信息,具体代码如下:

 1     public class MessageEntry
 2     {
 3         public string Id { get; private set; }
 4         public string Value { get; private set; }
 5         public string Category { get; private set; }
 6         public MessageEntry(string id, string value, string category)
 7         {
 8             this.Id = id;
 9             this.Value = value;
10             this.Category = category;
11         }
12 
13         public string Format(params object[] args)
14         {
15             return string.Format(this.Value, args);
16         }
17     }
MessageEntry.cs

3、新建文件Messages.xml,用以配置要生成的信息:

1 <?xml version="1.0" encoding="utf-8" ?>
2 <messages>
3     <message id="MandatoryField" value="The {0} is mandatory." category="Validation"/>
4     <message id="GreaterThan" value="The {0} must be greater than {1}." category="Validation"/>
5     <message id="ReallyDelete" value="Do you really want to delete the {0}." category="Confirmation"/>
6     <message id="UserInfo" value="Do you really want to delete the {0}." category="UserItemInfo"/>
7 </messages>
Messages.xml

4、修改Messages.tt文件如下:

 1 <#@template debug="false" hostspecific="true" language="C#"#>
 2 <#@assembly name="System.Core.dll"#>
 3 <#@assembly name="System.Xml"#>
 4 <#@import namespace="System"#>
 5 <#@import namespace="System.Xml"#>
 6 <#@import namespace="System.Linq"#>
 7 <#@output extension=".cs" #>
 8 namespace MessageCodeGenrator
 9 {
10     using System;
11     public static class Messages
12     {
13         <# XmlDocument messageDoc = new XmlDocument();
14             messageDoc.Load(this.Host.ResolvePath("Messages.xml"));
15             var messageEntries = messageDoc.GetElementsByTagName("message").Cast<XmlElement>();
16             var categories = (from element in messageEntries
17                             select element.Attributes["category"].Value).Distinct();
18             foreach (var category in categories)
19             {#>
20 
21         public static class <#=  category#>
22         {
23             <#
24             foreach (var element in messageDoc.GetElementsByTagName("message").Cast<XmlElement>().Where(element => element.Attributes["category"].Value == category))
25             {
26                 string id = element.Attributes["id"].Value;
27                 string value = element.Attributes["value"].Value;
28                 string categotry = element.Attributes["category"].Value;
29             #>
30 
31             public static MessageEntry <#= id #> = new MessageEntry("<#= id #>","<#= value#>","<#= categotry#>");
32         <#}#>
33 }
34     <#}#>
35 }
36 }
Messages.tt

5、右键点击Messages.tt,选择运行自定义工具,如下:

6、执行完后,查看Messages.cs文件,可以看到已经生成了所需要的代码:

 1 namespace MessageCodeGenrator
 2 {
 3     using System;
 4     public static class Messages
 5     {
 6         
 7         public static class Validation
 8         {
 9             
10             public static MessageEntry MandatoryField = new MessageEntry("MandatoryField","The {0} is mandatory.","Validation");
11         
12             public static MessageEntry GreaterThan = new MessageEntry("GreaterThan","The {0} must be greater than {1}.","Validation");
13         }
14     
15         public static class Confirmation
16         {
17             
18             public static MessageEntry ReallyDelete = new MessageEntry("ReallyDelete","Do you really want to delete the {0}.","Confirmation");
19         }
20     
21         public static class UserItemInfo
22         {
23             
24             public static MessageEntry UserInfo = new MessageEntry("UserInfo","Do you really want to delete the {0}.","UserItemInfo");
25         }
26     }
27 }
Messages.cs

 

posted @ 2014-09-09 14:09  自然去留  阅读(198)  评论(0编辑  收藏  举报