• ToolsCodeTemplate使用


    最近学习使用CodeSmith代码生成器

    CodeSmith 是一种语法类似于asp.net的基于模板的代码生成器,程序可以自定义模板,从而减少重复编码的劳动量,提高效率。

    作用:CodeSmith 是一种基于模板的代码生成工具,它使用类似于ASP.NET的语法来生成任意类型的代码或文本。与其他许多代码生成工具不同,CodeSmith 不要求您订阅特定的应用程序设计或体系结构。使用 CodeSmith,可以生成包括简单的强类型集合和完整应用程序在内的任何东西。

    当您生成应用程序时,您经常需要重复完成某些特定的任务,例如编写数据访问代码或者生成自定义集合。CodeSmith 在这些时候特别有用,因为您可以编写模板自动完成这些任务,从而不仅提高您的工作效率,而且能够自动完成那些最为乏味的任务。CodeSmith 附带了许多模板,包括对应于所有 .NET 集合类型的模板以及用于生成存储过程的模板,但该工具的真正威力在于能够创建自定义模板。

    应用:CodeSmith 是一种语法类似于asp.net的基于模板的代码生成器,程序可以自定义模板,从而减少重复编码的劳动量,提高效率。

    安装CodeSmith 2.6注册后发现有两个可运行程序CodeSmith Studio.exe和CodeSmith Explorer.exe

    CodeSmith Studio.exe用来创建自定义模板

    CodeSmith Explorer.exe用来导入模板并且生成代码

    打开 CodeSmith Studio.exe,新建一个C#模板。发现有如下类似与asp.net的标识符号

    <% %>

    <%= %>

    <%@ %>

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

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

    下面是使用CodeSmith常用的方法

      1 using System;
      2 using SchemaExplorer;
      3 using System.Data;
      4 using CodeSmith.Engine;
      5 using System.Text.RegularExpressions;
      6 
      7 /// <summary>
      8 /// CodeSmith公用方法类
      9 /// </summary>
     10 public class ToolsCodeTemplate:CodeTemplate
     11 {
     12     #region 获取Molde类名称
     13     /// <summary>
     14     /// 获取Molde类名称
     15     /// </summary>
     16     /// <param name="table"></param>
     17     /// <returns>表名称(表名称即为Model类名称)</returns>
     18     public string GetModelClassName(TableSchema table)
     19     {
     20         string result;
     21         if ( table.ExtendedProperties.Contains("ModelName") )
     22         {
     23             result = (string)table.ExtendedProperties["ModelName"].Value;    
     24             return MakePascal(result);
     25         }
     26     
     27         if (table.Name.EndsWith("s"))
     28         {
     29             result = MakeSingle(table.Name);
     30         }
     31         else
     32         {
     33             result = table.Name;
     34         }
     35         
     36         return MakePascal(result);
     37     } 
     38     #endregion
     39     
     40     #region 获取属性名称
     41     /// <summary>
     42     /// 获取属性名称
     43     /// </summary>
     44     /// <param name="column"></param>
     45     /// <returns></returns>
     46     public string GetPropertyName(ColumnSchema column)
     47     {
     48         return MakePascal(GetNameFromDBFieldName(column));
     49     }
     50     #endregion
     51     
     52     #region 获取从数据库字段得到的名称
     53     /// <summary>
     54     /// 获取从数据库字段得到的名称
     55     /// </summary>
     56     /// <param name="column"></param>
     57     /// <returns></returns>
     58     public string GetNameFromDBFieldName(ColumnSchema column)
     59     {
     60         return column.Name;
     61     }
     62     #endregion
     63     
     64     #region 获取属性类型
     65     /// <summary>
     66     /// 获取属性类型
     67     /// </summary>
     68     /// <param name="column"></param>
     69     /// <returns>属性类型</returns>
     70     public string GetPropertyType(ColumnSchema column)
     71     {
     72         return GetCSharpTypeFromDBFieldType(column);
     73     }
     74     #endregion
     75     
     76     #region 获取主键名称
     77     /// <summary>
     78     /// 获取主键名称
     79     /// </summary>
     80     /// <param name="TargetTable"></param>
     81     /// <returns>主键名称</returns>
     82     public string GetPKName(TableSchema TargetTable)
     83     {
     84         if (TargetTable.PrimaryKey != null)
     85         {
     86             if (TargetTable.PrimaryKey.MemberColumns.Count == 1)
     87             {
     88                 return TargetTable.PrimaryKey.MemberColumns[0].Name;
     89             }
     90             else
     91             {
     92                 throw new Exception("This template will not work on primary keys with more than one member column.");
     93             }
     94         }
     95         else
     96         {
     97             throw new Exception("This template will only work on tables with a primary key.");
     98         }
     99     }
    100     #endregion
    101     
    102     #region 获取主键类型
    103     /// <summary>
    104     /// 获取主键类型
    105     /// </summary>
    106     /// <param name="TargetTable"></param>
    107     /// <returns>主键类型</returns>
    108     public string GetPKType(TableSchema TargetTable)
    109     {
    110         if (TargetTable.PrimaryKey != null)
    111         {
    112             if (TargetTable.PrimaryKey.MemberColumns.Count == 1)
    113             {
    114                 return GetCSharpTypeFromDBFieldType(TargetTable.PrimaryKey.MemberColumns[0]);
    115             }
    116             else
    117             {
    118                 throw new ApplicationException("This template will not work on primary keys with more than one member column.");
    119             }
    120         }
    121         else
    122         {
    123             throw new ApplicationException("This template will only work on MyTables with a primary key.");
    124         }
    125     }
    126     #endregion
    127     
    128     #region 类型转化
    129     /// <summary>
    130     /// 获取数据库类型转化为C#类型
    131     /// </summary>
    132     /// <param name="column"></param>
    133     /// <returns>C#类型的字符串</returns>
    134     public string GetCSharpTypeFromDBFieldType(ColumnSchema column)
    135     {
    136         if (column.Name.EndsWith("TypeCode")) return column.Name;
    137         string type;
    138         switch (column.DataType)
    139         {
    140             case DbType.AnsiString: type= "string";break;
    141             case DbType.AnsiStringFixedLength: type= "string";break;
    142             case DbType.Binary: type= "byte[]";break;
    143             case DbType.Boolean: type= "bool";break;
    144             case DbType.Byte: type= "byte";break;
    145             case DbType.Currency: type= "decimal";break;
    146             case DbType.Date: type= "DateTime";break;
    147             case DbType.DateTime: type= "DateTime";break;
    148             case DbType.Decimal: type= "decimal";break;
    149             case DbType.Double: type= "double";break;
    150             case DbType.Guid: type= "Guid";break;
    151             case DbType.Int16: type= "short";break;
    152             case DbType.Int32: type= "int";break;
    153             case DbType.Int64: type= "long";break;
    154             case DbType.Object: type= "object";break;
    155             case DbType.SByte: type= "sbyte";break;
    156             case DbType.Single: type= "float";break;
    157             case DbType.String: type= "string";break;
    158             case DbType.StringFixedLength: type= "string";break;
    159             case DbType.Time: type= "TimeSpan";break;
    160             case DbType.UInt16: type= "ushort";break;
    161             case DbType.UInt32: type= "uint";break;
    162             case DbType.UInt64: type= "ulong";break;
    163             case DbType.VarNumeric: type= "decimal";break;
    164             default:
    165             {
    166                 type= "__UNKNOWN__" + column.NativeType;//未知
    167                 break;
    168             }
    169         }
    170         //是否为Null
    171         if(column.AllowDBNull && column.SystemType.IsValueType)
    172         {
    173             type=type+"?";
    174         }
    175         return type;
    176     }
    177     /// <summary>
    178     /// 获取数据库类型转化为C#类型
    179     /// </summary>
    180     /// <param name="dbType">DbType的类型</param>
    181     /// <returns>C#类型的字符串</returns>
    182     public string GetDBTypeToCSharpType (System.Data.DbType dbType)
    183     {
    184         switch (dbType)
    185         {
    186             case DbType.AnsiString:return "string";
    187             case DbType.AnsiStringFixedLength:return "string";
    188             case DbType.Binary:return "byte[]";
    189             case DbType.Boolean:return "bool";
    190             case DbType.Byte:return "byte";
    191             case DbType.Currency:return "decimal";
    192             case DbType.Date:return "DateTime";
    193             case DbType.DateTime:return "DateTime";
    194             case DbType.DateTime2:return "DateTime";
    195             case DbType.DateTimeOffset:return "DateTime";
    196             case DbType.Decimal:return "decimal";
    197             case DbType.Double:return "double";
    198             case DbType.Guid:return "Guid";
    199             case DbType.Int16:return "short";
    200             case DbType.Int32:return "int";
    201             case DbType.Int64:return "long";
    202             case DbType.Object:return "object";
    203             case DbType.SByte:return "sbyte";
    204             case DbType.Single:return "float";
    205             case DbType.String:return "string";
    206             case DbType.StringFixedLength:return "string";
    207             case DbType.Time:return "DateTime";
    208             case DbType.UInt16:return "ushort";
    209             case DbType.UInt32:return "uint";
    210             case DbType.UInt64:return "ulong";
    211             case DbType.VarNumeric:return "decimal";
    212             case DbType.Xml:return "string";
    213             default:return "object";
    214         }
    215     }
    216     #endregion
    217     
    218     #region 骆驼命名法,帕斯卡命名法和匈牙利命名法
    219     /// <summary>
    220     /// 获取首字母大写的字符串
    221     /// </summary>
    222     /// <param name="value">字符串(例如:xiangyisheng)</param>
    223     /// <returns>xiangyisheng => Xiangyisheng</returns>
    224     public string MakePascal(string value)
    225     {
    226         return value.Substring(0, 1).ToUpper() + value.Substring(1);
    227     }
    228     /// <summary>
    229     /// 获取首字母小写的字符串
    230     /// </summary>
    231     /// <param name="value">字符串(例如:Xiangyisheng)</param>
    232     /// <returns>Xiangyisheng => xiangyisheng</returns>
    233     public string MakeCamel(string value)
    234     {
    235         return value.Substring(0, 1).ToLower() + value.Substring(1);
    236     }
    237     /// <summary>
    238     /// 获取小写的字符串
    239     /// </summary>
    240     /// <param name="value">字符串(例如:XiangYiSheng)</param>
    241     /// <returns>XiangYiSheng => xiangyisheng</returns>
    242     public string MakeSmall(string value)
    243     {
    244         return value.ToLower();
    245     }    
    246     /// <summary>
    247     /// 获取单数形式的字符串
    248     /// </summary>
    249     /// <param name="name">字符串(例如:Xiangyishengs)</param>
    250     /// <returns>Xiangyishengs => Xiangyisheng</returns>
    251     public string MakeSingle(string name)
    252     {
    253         Regex plural1 = new Regex("(?<keep>[^aeiou])ies$");
    254         Regex plural2 = new Regex("(?<keep>[aeiou]y)s$");
    255         Regex plural3 = new Regex("(?<keep>[sxzh])es$");
    256         Regex plural4 = new Regex("(?<keep>[^sxzhyu])s$");
    257     
    258         if(plural1.IsMatch(name))
    259             return plural1.Replace(name, "${keep}y");
    260         else if(plural2.IsMatch(name))
    261             return plural2.Replace(name, "${keep}");
    262         else if(plural3.IsMatch(name))
    263             return plural3.Replace(name, "${keep}");
    264         else if(plural4.IsMatch(name))
    265             return plural4.Replace(name, "${keep}");
    266     
    267         return name;
    268     }
    269     /// <summary>
    270     /// 获取复数形式的字符串
    271     /// </summary>
    272     /// <param name="name">字符串(例如:Xiangyisheng)</param>
    273     /// <returns>Xiangyisheng => Xiangyishengs</returns>
    274     public string MakePlural(string name)
    275     {
    276         Regex plural1 = new Regex("(?<keep>[^aeiou])y$");
    277         Regex plural2 = new Regex("(?<keep>[aeiou]y)$");
    278         Regex plural3 = new Regex("(?<keep>[sxzh])$");
    279         Regex plural4 = new Regex("(?<keep>[^sxzhy])$");
    280     
    281         if(plural1.IsMatch(name))
    282             return plural1.Replace(name, "${keep}ies");
    283         else if(plural2.IsMatch(name))
    284             return plural2.Replace(name, "${keep}s");
    285         else if(plural3.IsMatch(name))
    286             return plural3.Replace(name, "${keep}es");
    287         else if(plural4.IsMatch(name))
    288             return plural4.Replace(name, "${keep}s");
    289     
    290         return name;
    291     }
    292     #endregion
    293     
    294     #region 打印标题
    295     /// <summary>
    296     /// 打印标题
    297     /// </summary>
    298     public void PrintHeader()
    299     {
    300         Response.WriteLine("//============================================================");
    301         Response.WriteLine("//http://www.cnblogs.com/xiangyisheng");
    302         Response.WriteLine("//============================================================");
    303         Response.WriteLine();
    304     }
    305     #endregion
    306 }
    ToolsCodeTemplate

    下面是我理解ToolsCodeTemplate测试例子

     1 <%-- 
     2 名称:测试模板
     3 作者:长毛象
     4 描述:测试模板
     5 网址:http://www.cnblogs.com/xiangyisheng
     6 --%>
     7 <%@ CodeTemplate Language="C#" TargetLanguage="text" Src="ToolsCodeTemplate.cs" Inherits="ToolsCodeTemplate" Debug="False" Description="测试模板" ResponseEncoding="UTF-8" %>
     8 <%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Default="" Optional="False" Category="Table" Description="源表名" OnChanged="" Editor="" EditorBase="" Serializer="" %>
     9 <%@ Assembly Name="SchemaExplorer" %>
    10 <%@ Import Namespace="SchemaExplorer" %>
    11 <%@ Import Namespace="System.Data" %>
    12 <% PrintHeader(); %>
    13 
    14 <%--获取Molde类名称 参数:表--%>
    15 获取Molde类名称:<%= this.GetModelClassName(this.SourceTable) %>
    16 
    17 <%--获取属性名称 参数:列--%>
    18 <%foreach(ColumnSchema column in this.SourceTable.NonForeignKeyColumns){%>
    19 获取属性名称:<%=this.GetPropertyName(column)%>
    20 <%}%>
    21 
    22 <%--获取从数据库字段得到的名称 参数:列--%>
    23 <%foreach(ColumnSchema column in this.SourceTable.NonForeignKeyColumns){%>
    24 获取从数据库字段得到的名称:<%=this.GetNameFromDBFieldName(column)%>
    25 <%}%>
    26 
    27 <%--获取属性类型 参数:列--%>
    28 <%foreach(ColumnSchema column in this.SourceTable.NonForeignKeyColumns){%>
    29 获取属性类型:<%=this.GetPropertyType(column)%>
    30 <%}%>
    31 
    32 <%--获取主键名称 参数:表--%>
    33 获取主键名称:<%= this.GetPKName(this.SourceTable) %>
    34 
    35 <%--获取主键类型 参数:表--%>
    36 获取主键类型:<%= this.GetPKType(this.SourceTable) %>
    37 
    38 <%--获取数据库类型转化为C#类型 参数:列--%>
    39 <%foreach(ColumnSchema column in this.SourceTable.NonForeignKeyColumns){%>
    40 获取数据库类型转化为C#类型:<%=this.GetCSharpTypeFromDBFieldType(column)%>
    41 <%}%>
    42 
    43 <%--获取数据库类型转化为C#类型2 参数:列类型--%>
    44 <%foreach(ColumnSchema column in this.SourceTable.NonForeignKeyColumns){%>
    45 获取数据库类型转化为C#类型2:<%=this.GetDBTypeToCSharpType(column.DataType)%>
    46 <%}%>
    47 
    48 <%--获取首字母大写的字符串 参数:字符串--%>
    49 <%foreach(ColumnSchema column in this.SourceTable.NonForeignKeyColumns){%>
    50 获取首字母大写的字符串:<%=this.MakePascal(column.Name)%>
    51 <%}%>
    52 
    53 <%--获取首字母小写的字符串 参数:字符串--%>
    54 <%foreach(ColumnSchema column in this.SourceTable.NonForeignKeyColumns){%>
    55 获取首字母小写的字符串:<%=this.MakeCamel(column.Name)%>
    56 <%}%>
    57 
    58 <%--获取小写的字符串 参数:字符串--%>
    59 <%foreach(ColumnSchema column in this.SourceTable.NonForeignKeyColumns){%>
    60 获取小写的字符串:<%=this.MakeSmall(column.Name)%>
    61 <%}%>
    62 
    63 <%--获取单数形式的字符串 参数:字符串--%>
    64 <%foreach(ColumnSchema column in this.SourceTable.NonForeignKeyColumns){%>
    65 获取单数形式的字符串:<%=this.MakeSingle(column.Name)%>
    66 <%}%>
    67 
    68 <%--获取复数形式的字符串 参数:字符串--%>
    69 <%foreach(ColumnSchema column in this.SourceTable.NonForeignKeyColumns){%>
    70 获取首字母大写的字符串:<%=this.MakePascal(column.Name)%>
    71 <%}%>
    TestTemplate

    创建生成实体类的模板,代码如下:

     1 <%--
     2 Name:实体类
     3 Author: Eason.Xiang
     4 Description:
     5 --%>
     6 <%@ CodeTemplate Language="C#" TargetLanguage="C#" Src="ToolsCodeTemplate.cs" Inherits="ToolsCodeTemplate" Debug="False" Description="生成指定Table的实体类(使用原始方式封装字段(Ctrl+R+E))" ResponseEncoding="UTF-8" %>
     7 <%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Default="" Optional="False" Category="Table" Description="源表名" OnChanged="" Editor="" EditorBase="" Serializer="" %>
     8 <%@ Property Name="NameSpace" Type="System.String" Default="Model" Optional="False" Category="NameSpace" Description="命名空间" OnChanged="" Editor="" EditorBase="" Serializer="" %>
     9 <%@ Property Name="IsFK" Type="System.Boolean" Default="False" Optional="False" Category="Other" Description="是否处理外键" OnChanged="" Editor="" EditorBase="" Serializer="" %>
    10 <%@ Property Name="Author" Type="System.String" Default="Jack.Zhou" Optional="False" Category="Other" Description="" OnChanged="" Editor="" EditorBase="" Serializer="" %>
    11 <%@ Assembly Name="SchemaExplorer" %>
    12 <%@ Assembly Name="System.Data" %>
    13 <%@ Assembly Name="mscorlib" %>
    14 <%@ Import Namespace="SchemaExplorer" %>
    15 <%@ Import Namespace="System.Data" %>
    16 <%@ Import Namespace="System.Collections.Generic" %>
    17 <% PrintHeader(); %>
    18 using System;
    19 using System.Collections.Generic;
    20 using System.Text;
    21 namespace <%=this.NameSpace%>
    22 {
    23     /// <summary>
    24     /// 实体类<%=this.GetModelClassName(this.SourceTable)%>
    25     /// </summary>
    26     public class <%=this.GetModelClassName(this.SourceTable)%>
    27     {
    28          #region 私有字段
    29          <%foreach(ColumnSchema column in this.SourceTable.ForeignKeyColumns){%>
    30          <%if(!IsFK){%>
    31          private <%=this.GetCSharpTypeFromDBFieldType(column)%> _<%=this.MakeCamel(column.Name)%>;
    32          <%}else{%>
    33          private <%=this.GetFKClassName(column)%> _<%=this.MakeCamel(column.Name)%>;
    34          <%}%>
    35          <%}%>
    36          <%foreach(ColumnSchema column in this.SourceTable.NonForeignKeyColumns){%>
    37          private <%=this.GetCSharpTypeFromDBFieldType(column)%> _<%=this.MakeCamel(column.Name)%>;
    38          <%}%>
    39          #endregion
    40          
    41          #region 公开属性
    42          <%foreach(ColumnSchema column in this.SourceTable.ForeignKeyColumns){%>
    43          <%if(!IsFK){%>
    44          public <%=this.GetCSharpTypeFromDBFieldType(column)%> <%=this.MakePascal(column.Name)%>
    45          {
    46             get{return _<%=this.MakeCamel(column.Name)%>;}
    47             set{_<%=this.MakeCamel(column.Name)%>=value;}
    48          }
    49          <%}else{%>
    50          public <%=this.GetFKClassName(column)%> <%=this.MakePascal(column.Name)%>
    51          {
    52             get{return _<%=this.MakeCamel(column.Name)%>;}
    53             set{_<%=this.MakeCamel(column.Name)%>=value;}
    54          }
    55          <%}%>
    56          <%}%>
    57          <%foreach(ColumnSchema column in this.SourceTable.NonForeignKeyColumns){%>
    58          public <%=this.GetCSharpTypeFromDBFieldType(column)%> <%=this.MakePascal(column.Name)%>
    59          {
    60             get{return _<%=this.MakeCamel(column.Name)%>;}
    61             set{_<%=this.MakeCamel(column.Name)%>=value;}
    62          }
    63          <%}%>
    64          #endregion
    65     }
    66 }
    67 <script runat="template">
    68 #region 获取外键类名
    69 public string GetFKClassName(ColumnSchema column)
    70 {
    71     foreach(TableKeySchema key in this.SourceTable.ForeignKeys)
    72     {
    73         foreach(MemberColumnSchema fk in key.ForeignKeyMemberColumns)
    74         {
    75             if(fk.Name==column.Name)
    76             {
    77                 return this.GetModelClassName(key.PrimaryKeyTable);
    78             }
    79         }
    80     }
    81     return "";
    82 }
    83 #endregion
    84 </script>
    TableEntity

    CodeSmith截图

     

    好了,目前大概就学到这里了。(原文:http://www.cnblogs.com/xiangyisheng/p/6208637.html)

  • 相关阅读:
    C# WinForm在高分辨率下界面模糊问题的解决
    C# 上传文件 造成内存溢出 解决方法
    C# Linq 交集、并集、差集、去重
    Linux 命令详解./configure、make、make install 命令
    需求分析的方法(二)
    需求分析的方法(一)
    WinDbG工具实践
    windows server 2008 IIS FTP服务器配置采坑
    网站CPU占满,微信经常SSL不能建立的错误排查
    ABP 数据迁移初始化的坑
  • 原文地址:https://www.cnblogs.com/xiangyisheng/p/6208637.html
Copyright © 2020-2023  润新知