zoukankan      html  css  js  c++  java
  • CodeSmith 初尝试

    看了黄聪写的 黄聪:如何使用CodeSmith批量生成代码(原创系列教程),感觉可以马上自己练练手。

    写了两个文件:Database.cst,Table.cst。Database引用table,然后生成数据库中所有表的Model类,代码如下:

    Table.cst

    //模板第一句?,必?的
    <%@ CodeTemplate Language="C#" TargetLanguage="Text" Src="" Inherits="" Debug="False" CompilerVersion="v3.5" Description="Template description here." %>
    //引用程序集
    <%@ Assembly Name="SchemaExplorer" %>
    //加载程序集中的命名空间
    <%@ Import Namespace="SchemaExplorer" %>
    
    //定义模板参数
    <%@ Property Name="Table" Type="SchemaExplorer.TableSchema" Default="" Optional="False" Description=""%>
    
    //模板内容
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Fw.Ts.Domain
    {
        [ModelExtension]
        public partial class <%=Table.Name%>
        {
            <%foreach(ColumnSchema col in Table.Columns)
            {%>
            [ModelColumnExtension("<%=Table.Name%>", "<%=col.Name%>", "<%=Table.Name%>.Id")]
            public <%=this.DataType2CSharpType(col.DataType)%> <%=col.Name%> { get; set; }
                
            <%}%>
        }
    }
    
    //自定义函数,可直接用this引用
    <script runat="Template">
        public string DataType2CSharpType(System.Data.DbType dbType)
            {
                switch (dbType)
                {
                    case DbType.AnsiString:
                        return "string";
                    case DbType.AnsiStringFixedLength:
                        return "string";
                    case DbType.Binary:
                        return "byte[]";
                    case DbType.Boolean:
                        return "bool";
                    case DbType.Byte:
                        return "byte";
                    case DbType.Currency:
                        return "decimal";
                    case DbType.Date:
                        return "DateTime";
                    case DbType.DateTime:
                        return "DateTime";
                    case DbType.DateTime2:
                        return "DateTime";
                    case DbType.DateTimeOffset:
                        return "DateTime";
                    case DbType.Decimal:
                        return "decimal";
                    case DbType.Double:
                        return "double";
                    case DbType.Guid:
                        return "Guid";
                    case DbType.Int16:
                        return "short";
                    case DbType.Int32:
                        return "int";
                    case DbType.Int64:
                        return "long";
                    case DbType.Object:
                        return "object";
                    case DbType.SByte:
                        return "sbyte";
                    case DbType.Single:
                        return "float";
                    case DbType.String:
                        return "string";
                    case DbType.StringFixedLength:
                        return "string";
                    case DbType.Time:
                        return "TimeSpan";
                    case DbType.UInt16:
                        return "ushort";
                    case DbType.UInt32:
                        return "uint";
                    case DbType.UInt64:
                        return "ulong";
                    case DbType.VarNumeric:
                        return "decimal";
                    case DbType.Xml:
                        return "string";
                    default:
                        return "object";
                }
            }
    </script>

    Database.cst

    //模板第一句话,必须的
    <%@ CodeTemplate Language="C#" TargetLanguage="Text" Src="" Inherits="" Debug="False" CompilerVersion="v3.5" Description="Template description here." %>
    
    //引用程序集
    <%@ Assembly Name="SchemaExplorer" %>
    //加载程序集中的命名空间
    <%@ Import Namespace="SchemaExplorer" %>
    
    //定义模板参数
    <%@ Property Name="DataSource" Type="SchemaExplorer.DatabaseSchema" Default="" Optional="False" Description=""%>
    
    //注册外部的模板,注册成变量,能在当前的模板中直接使用,如 CodeTemplate Template = new  EntityTemplate();
    <%@ Register Name="EntityTemplate" Template="Table.cst" MergeProperties="False" ExcludeProperties="" %>
    
    //执行模板
    <%
    //运行
    this.GenerateEntityClasses();
    
    Console.WriteLine("OK");
    %>
    
    //自定义函数,可直接用this引用
    <script runat="template">
        private void GenerateEntityClasses()
        {
            CodeTemplate Template =new EntityTemplate();
            foreach(TableSchema table in this.DataSource.Tables)
            {
                string FileDirectory = OutputDirectory +"\"+ table.Name +".cs";
                Template.SetProperty("Table",table);
                Template.RenderToFile(FileDirectory,true);
            }
        }
    
        private string Directory = String.Empty;
        //设置输出路径,特性[Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))]
        [Editor(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))] 
        [Optional, NotChecked]
        [DefaultValue("")]
        public string OutputDirectory 
        { 
            get
            {
                return Directory;
            }
            set
            {
                if (value.EndsWith("\")) value = value.Substring(0, value.Length -1);
                    Directory = value;
            } 
        }
    </script>

    生成结果:

    image

  • 相关阅读:
    Android 4.2开发环境搭建
    ManagementFactory cannot be resolved
    html css鼠标样式,鼠标形状
    开普勒三定律
    Apache CXF简介
    C++学习基础八——重载输入和输出操作符
    C++学习基础七——深复制与浅复制
    C++学习基础六——复制构造函数和赋值操作符
    C++学习基础五之函数参数——形参
    C++学习基础四——顺序容器和关联容器
  • 原文地址:https://www.cnblogs.com/mylct/p/4151642.html
Copyright © 2011-2022 走看看