博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

CodeSmith---功能和技巧收集

Posted on 2009-07-15 11:36  linFen  阅读(1300)  评论(0编辑  收藏  举报

官方网站:http://www.codesmithtools.com/

5.0破解文件下载:http://kewlshare.com/dl/0538fcf454d3/CodeSmith.5.0.Professional.Incl.Patch.DTCG.rar.html

 

资料:

http://blog.sina.com.cn/s/articlelist_1229294631_3_1.html

http://www.cnblogs.com/Terrylee/category/44974.html

 

快捷键:

1.Ctrl + Shift + C

在空行上,按下Ctrl + Shift + C后将会录入一个代码块。<% %>

2.Ctrl + Shift + Q

<script runat="template"></script>

3.Ctrl + Shift + V

对代码块反转,如有下面这样一行代码:<% for(int i=0;i<10;i++){}%>

在两个大括号之间按下Ctrl + Shift + V后,将变成如下代码:<% for(int i=0;i<10;i++){%> <%}%>

4.Ctrl + Shift + W

按下Ctrl + Shift + W后会录入一个输出的代码块:

<%= %>

注意:在使用快捷键的时候,如果想要把一段代码之间放在录入的标记中间,首先选中这些代码,再按下快捷键组合。比如我们有一段这样的代码,想把它放在<script>里面。

public enum CollectionTypeEnum

{

 Vector, HashTable, SortedList

}

选中它,再按下Ctrl + Shift + Q后就会变成:

 

技巧集:

1.如何在模板中添加注释

CodeSmith:<%-- Comments --%>

VB.NET:<%-- 'Comments --%>

C#:<%-- // Comments --%> <%-- /* Comments */ --%>

 

2.创建一个可以下拉选择的属性

首先定义一个枚举类型的变量,然后将属性的类型设置为枚举型

<%@ Property Name="CollectionType" Type="CollectionTypeEnum" Category="Collection" Description="Type of collection" %>

 

<script runat="tempate">

public enum CollectionTypeEnum

{

      Vector,

      HashTable,

      SortedList

}

</script>

 

3.解决ASP.NET中标签<%重复问题

先将ASP.NET中使用的这个重复标签写成<%%,避免在生成代码时由于是标签重复引起的编译错误或生成错误。

 

4.如何声明一个常量 

<script runat="template">

private const string MY_CONST = "example";

</script>

 

5.如何对模板进行调试

如果要调试一个模板,首先要在代码模板里进行声明,然后在你想要进行调试的地方用Debugger.Break()语句设置断点即可。

<%@ CodeTemplate Language="C#" TargetLanguage="T-SQL" Description="Debugging your template" Debug="true" %>

<% Debugger.Break(); %>

 

6.如何将属性设置成选择一个文件夹的路径

[Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))]

public string OutputDirectory

{

      get {return _outputDirectory;}

      set {_outputDirectory= value;}

}

 

7.怎样调用子模板

<%

foreach (TableSchema table in SourceDatabase.Tables)

{

   OutputSubTemplate(table);

}

%>

<script runat="template">

private CodeTemplate _mySubTemplate;

 

Browsable(false)]

public CodeTemplate MySubTemplate

{

   get

   {

      if (_mySubTemplate == null)

      {

         CodeTemplateCompiler compiler = new CodeTemplateCompiler(this.CodeTemplateInfo.DirectoryName + "MySubTemplate.cst");

         compiler.Compile();

         if (compiler.Errors.Count == 0)

         {

            _mySubTemplate = compiler.CreateInstance();

         }

         else

         {

            for (int i = 0; i < compiler.Errors.Count; i++)

            {

               Response.WriteLine(compiler.Errors[ i].ToString());

            }

         }

      }

      return _mySubTemplate;

   }

}

 

public void OutputSubTemplate(TableSchema table)

{

   MySubTemplate.SetProperty("SourceTable", table);

   MySubTemplate.SetProperty("IncludeDrop", false);

   MySubTemplate.SetProperty("InsertPrefix", "Insert");

  MySubTemplate.Render(Response);

}

</script>

     

8.在加载模板时默认加载的命名空间Namespaces和组件Assemblies

组件:mscorlib, System, System.Xml, System.Data, System.Drawing, Microsoft.VisualBasic, System.Windows.Forms, CodeSmith.Engine

命名空间:System, System.Data, System.Diagnostics, System.ComponentModel, Microsoft.VisualBasic, CodeSmith.Engine

 

9.使用SchemaExplorer能否确定一个字段(Field)是标识字段(主键,Identity Field)

在字段的扩展属性集合中包含一个叫“CS_IsIdentity”的属性,如果这个属性的值为true,则表名当前字段为一个标识字段

Identity Field = <% foreach(ColumnSchema cs in SourceTable.Columns) {

       if( ((bool)cs.ExtendedProperties["CS_IsIdentity"].Value) == true)

       {

             Response.Write(cs.Name);

       }

 }

 %>

 

10.如何确定一个字段的默认值

在字段的扩展属性集合中包含一个叫“CS_Default”的属性

 <%

 foreach(ColumnSchema cs in SourceTable.Columns) {

       if (cs.ExtendedProperties["CS_Default"] != null)

       {

            Response.WriteLine(cs.ExtendedProperties["CS_Default"].Value);

       }

 }

 %>

 

11.如何使用SchemaExplorer得到存储过程的输入输出参数

使用CodeSmith提供的CommandSchema对象,它包含需要的输入输出参数集合

 Input Parameters:

 <%foreach(ParameterSchema ps in SourceProcedure.AllInputParameters)

 {

       Response.Write(ps.Name);

       Response.Write(""n");

 }

 %>

 Output Parameters:

 <%foreach(ParameterSchema ps in SourceProcedure.AllOutputParameters)

 {

       Response.Write(ps.Name);

       Response.Write(""n");

 }

 %>

 

12.通过编程执行模版 CodeSmith在执行模版时通过调用一些API来完成的

主要经过了以下这几步的操作:

编译一个模版

显示编译错误信息

创建一个新的模版实例

用元数据填充模版

输出结果

 

下面这段代码显示了这些操作:

CodeTemplateCompiler compiler = new CodeTemplateCompiler("..""..""StoredProcedures.cst");

compiler.Compile();

if (compiler.Errors.Count == 0)

{

    CodeTemplate template = compiler.CreateInstance();

    DatabaseSchema database = new DatabaseSchema(new SqlSchemaProvider(), @"Server=(local)"NetSDK;Database=Northwind;Integrated Security=true;");

    TableSchema table = database.Tables["Customers"];

    template.SetProperty("SourceTable", table);

    template.SetProperty("IncludeDrop", false);

    template.SetProperty("InsertPrefix", "Insert");

    template.Render(Console.Out);

}

else

{

    for (int i = 0; i < compiler.Errors.Count; i++)

    {

        Console.Error.WriteLine(compiler.Errors[i].ToString());

    }

}

在这里我们用了Render方法,其实CodeTemplate.RenderToFile和CodeTemplate.RenderToString方法可能更有用,它可以直接让结果输出到文件中或赋给字符型的变量。

 

13.重载Render方法来控制输出

 在CodeSmith中,CodeTemplate.Render方法是在模版执行完成进行模版输出时执行,你可以通过重载CodeTemplate.Render方法来修改CodeSmith输出时的事件处理。例如:你可以修改模版输出时的方式来代替现在默认的方式,下面这段代码展示了在保持CodeSmith默认的窗口显示的同时,把结果输出到两个不同的文件。

 <%@ 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(@"C:"test1.txt", true);

     this.Response.AddTextWriter(fileWriter1);

 

     StreamWriter fileWriter2 = new StreamWriter(@"C:"test2.txt", true);

     this.Response.AddTextWriter(fileWriter2);

 

     base.Render(writer);

 

     fileWriter1.Close();

     fileWriter2.Close();

}

</script>注意不能忘了base.Render(writer);这句话,否则你将不能获得默认的输出。当重载CodeTemplate.Render方法时,你也可以访问TextWriter,也就是说你也可以直接添加其它的附属信息到模版输出的内容中。

 

14.生成的代码输出到文件中

在CodeSmith中,要把生成的代码文件输出到文件中,你需要在自己的模版中继承OutputFileCodeTemplate类。

<%@ CodeTemplate Language="C#" TargetLanguage="C#" Inherits="OutputFileCodeTemplate" Description="Build custom access code." %>

<%@ Assembly Name="CodeSmith.BaseTemplates" %>

OutputFileCodeTemplate主要做两件事情:

1.它添加一个名为OutputFile的属性到你的模版中,该属性要求你必须选择一个文件;

2.模版重载了方法OnPostRender(),在CodeSmith生成代码完成后把相应的内容写入到指定的文件中去。

如果想要自定义OutputFile属性弹出的保存文件对话框,你需要在你的模版中重载OutputFile属性。例如:你希望用户选择一个.cs文件来保存生成的代码,需要在你的模版中添加如下代码:

<script runat="template">

// Override the OutputFile property and assign our specific settings to it.

[FileDialog(FileDialogType.Save, Title="Select Output File", Filter="C# Files (*.cs)|*.cs", DefaultExtension=".cs")]

public override string OutputFile

{

    get {return base.OutputFile;}

    set {base.OutputFile = value;}

}

</script>

 

15.从父模版拷贝属性

 在使用CodeSmith进行代码生成的时候,你可能需要在子模版和父模版之间共享属性。比如,写一个基于数据库生成代码的模版,在每个模版里面都定义了一个名为Server的属性。当你在父模版中使用此属性时,它的值只对父模版起作用。想要设置此值到子模版,可以在父模版中使用CopyPropertiesTo方法,当在父模版中使用此属性时,它的值会发送到子模版中去。下面这段代码展示了如何使用该方法:

 // instantiate the sub-template

   Header header = new Header();

   // copy all properties with matching name and type to the sub-template instance

   this.CopyPropertiesTo(header);

 

16.利用继承生成可变化的代码

 用CodeSmith生成可变化的代码,其实是先利用CodeSmith生成一个基类,然后自定义其它类继承于该类。当我们重新生成基类时CodeSmith不要接触继承的子类中的代码。看下面的这段模版脚本:

<%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Base class generator." %>

<%@ Property Name="ClassName" Type="System.String" Description="Name of the class." %>

<%@ Property Name="ConstructorParameterName" Type="System.String" Description="Constructor parameter name." %>

<%@ Property Name="ConstructorParameterType" Type="System.String" Description="Data type of the constructor parameter." %>

class <%= ClassName %>

{

    <%= ConstructorParameterType %> m_<%= ConstructorParameterName %>;

    public <%= ClassName %>(<%= ConstructorParameterType %> <%= ConstructorParameterName %>)

    {

        m_<%= ConstructorParameterName %> = <%= ConstructorParameterName %>

    }

}

该模版生成的代码可能如下:

 class Account

 {

     int m_balance;

     public Account(int balance)

     {

         m_balance = balance

     }

 

}

把生成的文件保存为Account.cs文件。这时我们可以编写第二个类生成Check.cs文件代码:

class Checking : Account

{

    public Checking : base(0)

    {

    }

}

现在如果需要改变Account Balance的类型为浮点型,我们只需要改变ConstructorParameterType属性为float,并重新生成Account.cs文件即可而不需要直接在Account.cs中进行手工修改,并且不需要修改Check.cs文件的任何代码。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhaili1978/archive/2008/10/28/3167547.aspx