CodeSmith之四 - 典型实例(四)

一、SchemaExplorer获取数据库信息

  在CodeSmith中,读取数据库信息是通过SchemaExplorer对象。
  更多数据库方面的信息,可以在第三篇中找到,下面来看一个通过输入一个数据库,输出数据库信息的实例:

  首先,建一个数据库,新建如下表:

  CodeSmith之四 - 典型实例(四)

  模板代码:

<%@ CodeTempLate Language="C#" ResponseEncoding="UTF-8" Description="" %>

<%--Type数据类型为SchemaExplorer.Databasechema,表明参数SourceDatabase是一个数据库对象。--%>

<%@ Property Name="SourceDataBase" Type="SchemaExplorer.DatabaseSchema" Category="数据库" Description="获取数据库信息" %>

<%--引入数据库操作组件--%>

<%@ Assembly Name="SchemaExplorer" %>

<%@ Import Namespace="SchemaExplorer" %>



数据库名称:<%= SourceDataBase.Name %>

<%--获取数据库下的所有表--%>

<% foreach(TableSchema table in SourceDataBase.Tables) %>

<% { %>

    表:<%= table.Name %>下的列:

    <% foreach(ColumnSchema column in table.Columns) %>

    <% { %>

        列名:<%= column.Name %>;    类型:<%= column.DataType %>;    说明:<%= column.Description %>    

    <% } %>

    

    外键:

    <% if(table.ForeignKeyColumns != null) %>

    <% { %>

        外键列名:

        <% foreach(var r in table.ForeignKeyColumns) %>

        <% { %>

            <%= r.Name %>

        <% } %>

    <% } %>

<% } %>

  以上代码输出结果如下:

  CodeSmith之四 - 典型实例(四)

  代码说明:

  <%@ Assembly Name="组件名"%>:引用组件,等同于程序中的添加引用
  <%@ Import Namespace="组件名"%>:导入组件,等同于程序中的using

  注意:如果不知道怎么选择数据库(即输入数据库这个参数),可以本系列查看第一篇。

二、Include引用外部资源

 <!-- #include file="NewTemplate2.cst" -->  引入外部文件。

   引入了外部文件后,就能够调用外部文件的变量、常量、方法等。

   示例,假设我们有两个cst文件:NewTemplate1.cst,NewTemplate2.cst。

  NewTemplate2.cst:

<%@ Template Language="C#" TargetLanguage="Text" %>

<script runat="template">

public int GetMax(int a,int b)

{

  return a > b ? a:b;

}

</script>

  NewTemplate1.cst:

<%@ CodeTempLate Language="C#" ResponseEncoding="UTF-8" Description="" %>

<!-- #include file="NewTemplate2.cst" -->

<%= GetMax(5,8) %>

  以上代码输出8。

三、生成代码保存到文件

   注意要记住引用下面这两个文件:

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

  <%@ Import Namespace="CodeSmith.BaseTemplates" %>

  NewTemplate1.cst:

<%@ CodeTempLate Language="C#" ResponseEncoding="UTF-8" Description="" %>

<%@ Register Name="MyEntityClass" Template="D:\代码\NewTemplate2.cst" MergeProperties="False" ExcludeProperties="" %>

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

<%@ Import Namespace="CodeSmith.BaseTemplates" %>



<% CodeTemplate  temp = new MyEntityClass(); %>

<% temp.RenderToFile(@"D:\代码\生成路径.txt", true); %> 

  NewTemplate2.cst:

<%@ CodeTempLate Language="C#" ResponseEncoding="UTF-8" Description="" %>

打算把我生成到哪里?

  点击生成NewTemplate1.cst之后,目录"D:\代码\",会出现一个"生成路径.txt"的文件,正是我们希望生成的文件。

  RenderToFile(),第一个参数是生成路径,第二个参数是否覆盖原有文件。

  另外,假若要调用生成的文件,如上面的NewTemplate2.cst文件是有属性的,只需要

  <% temp.SetProperty("pro",123); %>  

  就能够轻松设置属性值。 

四、将属性输入设置为选择路径

  当我们需要的参数是计算机本地的一个有效路径时,这是将参数设置为路径让用户选择就最好不过了。

  实现代码如下:

<%@ CodeTempLate Language="C#" ResponseEncoding="UTF-8" Description="" %>

<script runat="template">

private string _outputDirectory;

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

public string OutputDirectory

{

      get {return _outputDirectory;}

      set {_outputDirectory= value;}

}

</script>

<%= OutputDirectory %>

  不再截取图片。总之,在输入参数的时候,点击右边的...就会打开文件选择。

  对于以上代码,淡黄色背景那行才是重点,实际上如果去掉那行,一样要输入属性,只是输入时会变成普通字符串,不能再打开文件选择框。这是一个反射,从中可以看到Editor接受的是两个Type类的对象作为参数。如果我们将第一个参数改为

  typeof(System.Windows.Forms.Design.FileNameEditor)

  那么就变成了文件选择框,而不是目录选择框。

你可能感兴趣的:(code)