CodeSmith(5):其它功能和技巧收集

转载 2012年03月27日 18:04:11

CodeSmith(5):其它功能和技巧收集  

2011-01-26 11:20:47|  分类: 、CodeSmith| |  标签:模版  codesmith  template  代码  compiler   |字号 订阅

下载:

官方网站: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

 

快捷键

1Ctrl + Shift + C

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

2Ctrl + Shift + Q

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

3Ctrl + Shift + V

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

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

4Ctrl + 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文件的任何代码。

17.CodeSmith调用NET写的外部DLL类库

CodeSmith中不能直接支持COM组件,可是CodeSmith支持使用.Net组件。
既然CodeSmith支持使用.Net组件,那么我们就可以通过CodeSmith来调用外部的DLL了,具体的看我的操作:
第一步:使用vs(我这里使用的是VS2005)编写你的dll类库,并且生成此类库文档的xml说明文档,你不会?在项目的属性里--生成--输出 下面勾选 XML文档文件,OK啦,这样就会在你的相应的文件夹下生成xml文档了
第二步:将工程编译完成后,把程序集放入CodeSmith文件夹的Addins文件夹中。然后就可以在CodeSmith模板中使用了。
实例:我的CodeSmith模板的写法如下,你可以做个参考:
<%@ Assembly Name="BrcLib" %>
<%@ Import Namespace="BrcLib" %>
这样就可以使用你刚才编写的类库了。


相关文章推荐

Codesmith使用技巧

CodeSmith 是一种语法类似于asp.net的基于模板的代码生成器,程序可以自定义模板,从而减少重复编码的劳动量,提高效率。  下面我们就来学习一下CodeSmith的使用吧。 首先...

CodeSmith使用技巧

  • 2013-03-08 23:42
  • 633KB
  • 下载

Android调用平台功能具体技巧分享

Android操作系统那个可以通过调用手机平台来实现一些特定的功能,诸如网页的显示,邮件的发送等等。那么今天就为大家总结了几个Android调用平台功能的应用技巧,帮助大家增加编程经验。 And...

CodeSmith技巧

  • 2009-08-29 12:17
  • 633KB
  • 下载

Qt隐藏的功能和技巧

Q_GADGET:不需要从QObject继承就可以使用Qt的Meta Object功能Q_ENUMS:对枚举对象进行反射(reflection)Q_SIGNAL:不需要signals关键字就可以将一个...

CodeSmith5,的破解工具

  • 2010-07-21 10:39
  • 54KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)