codeSmith高速用
CodeSmith 是一种语法类似于asp.net的基于模板的代码生成器,程序可以自定义模板,从而减少重复编码的劳动量,提高效率。
下面我们就来学习一下CodeSmith的使用吧。
首先我们来看一看一个简单的模板文件:
<%@ CodeTemplate Language="C#" TargetLanguage="C#"
Description="Generates a class including a special informational header" %>
<%@ Property Name="NameSpace" Type="String"
Category="Context"
Description="The namespace to use for this class" %>
<%@ Property Name="ClassName" Type="String"
Category="Context"
Description="The name of the class to generate" %>
<%@ Property Name="DevelopersName" Type="String"
Category="Context"
Description="The name to include in the comment header" %>
using System;
namespace <%=NameSpace %>
{
/// <summary>
/// Summary description for <%=ClassName %>.
/// </summary>
public class <%=ClassName %>
{
public <%=ClassName %>()
{
//
// TODO: Add constructor logic here
//
}
}
}
解析:
第一句:
这个是模板中唯一必须的声明,包含一些模板特殊的属性,包含模板使用的语言、生成的语言和一些对于模板的描述。
CodeTemplate代表代码的模板,Language是我们要指定模板的语言,TargetLanguage我们要指定的模板应用的目标语言,一般与language一致。
Description描述信息。
第二句:
<%@ Property Name="NameSpace" Type="String"
Category="Context"
Description="The namespace to use for this class" %>
Property:指定我们要声明的属性,Name指定当前属性的名称,Type指定当前属性的类型,Category:用来说明这个属性在CodeSmith Explorer的属性面板中显示成什么类型,例
如下拉选择、直接输入等,Description是指定当前属性的描述。
第三句:第三句是C#语言的定义了,在定义这些语句的时候只要我们在需要做成模板进行替换的地方写上<%=属性名 %>就行了。这样一个超级简单的模板就出来了。
运行模板文件的效果如图:
在使用模板的时候,我们通常都能看到下拉列表的选择,那么我们应该怎么去编写带有下拉列表的模板呢?其实很简单,先定义一个枚举类型的变量,然后将属性的类型设置为枚举型的就可以了。下面我们来看一看例子:
在脚本标签<script>中必须包含这个参数runat=”template”,否则他会被处理成普通文本。当设置了参数runat=”template”的时候我们就可以在script标签中放置一些比较有用的帮助方法,方便我们的调用,在上面的下拉选择中,设置了这个属性,并且枚举的enum名称和属性Type的名称一致,就可以调用脚本中定义的枚举了。上述的模板完成图为:
在一些特殊的场合中会有标签<%重复的问题,例如在asp.net或是jsp等等场合中,那么我们可以先将asp.net或jsp中使用的这个重复标签写成这种形式<%%,在代码叶,标签重复引起的编译错误或生成错误。
常量的使用是必不可少的,那么如何在codesmith中声明一个常量呢?代码很简单如下,和使用下拉列表的定义差不多。
<script runat="template">
private const string COUNT="example";
</script>
额外参数讲解:
代码模板的声明(CodeTemplate Directive):
Inherits:所有CodeSmith模板默认继承自CodeSmith.Engine.CodeTemplate,这个
类提供模板使用的一些基本功能,像ASP.NET页面的Page类,这些被继承的类的属性可以被
修改,但是这些新的类也必须继承CodeSmith.Engine.CodeTemplate。CodeSmith也同样
可以找到这个类,当然你要引入一个组件包含这个类。
Src:在某些方面Src和继承Inherits比较相似,它们都允许你从其他的类包含一些功能进
模板。这两个属性的区别是,Src可以让类与你的模板被动态编译,而Inherits仅允许你提供
一个已经编译好的类或组件。
Debug:可以确定是否在模板中可以包含调试符号。如果将这个属性设置为True,则可以
使用System.Diagnostics.Debugger.Break()方法来设置断点。
属性的声明(Property Directive):
Optional:设置这个属性是否是必须的,设置为True则这个参数必须有值,设置为False则表明这个参数值可有可无。
Editor:表明在属性面板中输入这个属性的值时使用何种GUI(图形界面编辑器)编辑器。
EditorBase:编辑器使用的基本类型,如果没有被说明,UITypeEditor为默认编辑器。
Serializer:序列化器参数指定类型时要使用的属性值序列化
XML属性声明(XmlProperty Directive)
例:<%@ XmlProperty Name="EntityMap" Schema="EntityMap.xsd" Optional="False" Category="Context" Description="EntityMap XML file to base the output on." %>
XML属性的参数:
Name:名称。
Schema:这个参数用来指定一个XSD文件,创建一个强类型对象模型。如果这个计划被指定,编译器会尝试分析这个XSD文件并为这个计划生成一个强类型对象模型,这样可以在模版中使用强类型和智能与XML协同工作。如果这个计划没有被设定,这个参数将为XmlDocument类型并且将使用XML DOM去导航到一个XML内容并生成代码。
Category:在CodeSmith属性面板中的类别。
Description:描述。
Optional:这个参数是否是必须的,如果设置为True,则参数不是必须的,反之False则为必须的。在设置为False时,如果用户没有提供参数则CodeSmith不能继续运行。
注册的声明(Register Directive)
这个属性通常被用作引入另一个模版文件并与当前的模版文件同时被编译。这是一种使用子模版的交互方法。
例:<%@ Register Name="MySubTemplate" Template="MySubTemplate.cst" MergeProperties="True" ExcludeProperties="SomeExcludedPropertyName,SomeProperties*" %>
模版一旦被注册,就可以建立一个模版的实例,然后象这样设置它的属性:
注册的参数:
Name:代表被引入的模版的名称。它可以被用作创建一个模版的实例。
Template:被引入模版文件的相对路径,它可以与当前的模版一起被动态的编译。
MergeProperties:设置成True时,所有被引用的面板的属性将被动态的添加到当前模版中。
ExcludePorperties:当使用MergeProperties时,你可能不需要某些属性被添加到当前模版中。将不需要的属性以逗号分隔放在这里,*号可以被用作通配符使用。
组件的声明(Assembly Directive)
用作在模版中引用一个外部部组件,或者包含一个编译好的源文件。
例:<%@ Assembly Name="SchemaExplorer" %>
或<%@ Assembly Src="MySourceFile.cs" %>
CodeSmith自动加载一些不同的组件:System, System.Diagnostics, System.ComponentModel, Microsoft.VisualBasic, CodeSmith.Engine
组件的参数:
Name:需要引用组件的名称,组建必须存在于Global Assembly Cache,与CodeSmith在同一路径下或与模版文件在同一路径下。
Src:要包含文件的相对路径。
引入的声明(Import Directive)
在模版中引入一个命名空间,这个与VB.NET中的Imports和C#中的using相同。
例:<%@ Import Namespace="SchemaExplorer" %>
引入的参数:
NameSpace:被引入的命名空间的名字。记住同时必须要加载包含这个命名空间的相应组件,除非这个组件是被默认加载的。
- 1楼Wentasy昨天 19:41
- 第一次听说博主提到的东西,学习了。