codeSmith的使用教程

       CodeSmith基础教程

〇、            前言

花费了一天的时间学习并写了一个CodeSmith可以使用的模板。在此记录下CodeSmith的学习笔记。希望对同学们有帮助。

所用工具: CodeSmith Professional v5.1.3.8510,代码示例全部是以C#为例。

一、            工具设置

CodeSmith默认是不支持中文的,那么我们必须要先设置使其支持中文显示,保存。并且要能够在生成文件中支持中文。

1.    [Tools->Options...->Studio->Editor->Enable unicode]将这个选项勾上,那么CodeSmith就可以显示和保存中文了。

2.    在你的模板的最前面的一句话,C#为例:

<%@ CodeTemplate TargetLanguage="Text" Src="" Inherits="" Debug="False" CompilerVersion="v3.5" Description="Template description here." %>

中加入ResponseEncoding="UTF-8" 的标签。将会使得生成的文件也支持中文。

1.    [Tools->Options...->Studio->Editor->Convert tab to]去掉这个的勾选,就是不使用空格来替换Tab

 

二、            模板区域说明

CodeSmith的模板分为六个区域:模板说明区域,属性设置区域,注册模板区域,引用声明区域,模板区域,函数区域。

()        模板说明区域,只有一句话:

<%@ CodeTemplate ResponseEncoding="UTF-8" TargetLanguage="Text" Src="" Inherits="" Debug="False" CompilerVersion="v3.5" Description="这里是模板说明" %>

()        属性设置区域

你模板需要那些外接参数,都可以写在这里。当然还有一些其他的参数需要些在函数区域,在后面我们再来描述。

1)   String类型参数声明:

<%@ Property Default="AAA" Optional="True" Category="输入参数" Description="这是一个字符串型的参数" %>

2)   Bool类型参数声明:

<%@ Property Default="True" Optional="False" Category="输入参数" Description="这是一个布朗型的参数" %>

3)   DatabaseSchema类型参数声明:

<%@ Property Category="Context" Description="这是一个数据库" %>

4)   TableSchemaCollection类型参数声明:

<%@ Property Category="Context" Description="这是一个数据表集合" %>

5)   TableSchema类型参数声明:

<%@ Property Category="Context" Description="这是一个数据表" %>

()        注册模板区域

在你的模板中可以调用其他的模板用于生成,当然,你调用的模板所需要的参数你都必须给出。注册代码如下:

<%@ Register Template="B.cst" MergeProperties="False" ExcludeProperties="" %>

这就是将B模板注册到A模板中。

()        引用声明区域

在这里要将我们使用到了的应用集都在这里写出来,如果使用到数据库就一定要添加下面的两个。

<%@ Assembly %>

<%@ Import Namespace="SchemaExplorer" %>

要自己控制输出文件的话就需要添加:<%@ Import Namespace="System.IO" %>

()        模板区域

这里就是我们控制要输出的文件或者界面的内容。

直接输出值为<%= ThisIsString %>

调用代码为<% if (ThisIsBool) { %>A<% } %> 如果ThisIsBooltrue则输出A

()        函数区域

在这里我们可以定义我们自己的函数,用于一些复杂的组合、代码的重用等。代码格式和C#完全一样。

 

三、            模板编写方法

A.     直接输出

在模板区域直接输入文本,就会直接输出的output里面了。

 

B.     变量输出

例如输出ThisIsString的变量值:<%= ThisIsString %>

再例如输出ThisIsTable的名字:<%= ThisIsTable.Name %>

 

C.      调用函数

例如,如果输入的ThisIsBooltrue就输出A字符。

<% if (ThisIsBool) { %>A<% } %>

 

 

D.    调用模板

这里我们将在A模板内调用并显示B模板。每个模板都有一个Response来存储模板输出的。模板显示是调用Render()方法来完成的。

<% for(int i = 0; i < ThisIsTableList.Count; i++)

{

    B b = new B();

    b.ThisIsTable = ThisIsTableList[i];

    b.Render(this.Response);

} %>

 

E.      遍历DatabaseTableCollection内的表

这里我们可以使用for或者foreach做循环,为了通用性例子全部使用for做循环。

遍历ThisIsDatabase并输出表名

<% for (int t = 0; t < ThisIsDatabase.Tables.Count; t++) { %>

    <%= ThisIsDatabase.Tables[t].Name %>

<% } %>

 

F.      遍历Table的列

遍历ThisIsTable的列并且生成类似如下格式的语句:

//数据库类型:DbType.int

private int _ID;

这里调用了一个方法DataType2CSharpType(System.Data.DbType dbType)在后面将会讲到。

<% for (int c = 0; c < ThisIsTable.Columns.Count; c++) { %>

    //数据库类型:DbType.<%= DataType2CSharpType(ThisIsTable.Columns[c].DataType) %>

    private <%= DataType2CSharpType(ThisIsTable.Columns[c].DataType) %> _<%= ThisIsTable.Columns[c].Name %>;

   

<% } %>

 输出结果:

    //数据库类型:DbType.int

    private int _ID;

   

    //数据库类型:DbType.int

    private int _ClassID;

   

    //数据库类型:DbType.string

    private string _StudentName;

 

G.     遍历TablePK

<% for (int c = 0; c < ThisIsTable.PrimaryKey.MemberColumns.Count; c++) { %>

主键<%= c %>:<%= ThisIsTable.PrimaryKey.Name %>

    <%= ThisIsTable.PrimaryKey.Table.Name %>.<%= ThisIsTable.PrimaryKey.MemberColumns[c].Name %>

<% } %>

输出结果 

主键0:PK_Student

    Student.ID

 

H.    遍历TableFK(Table自己是外键表<Table为明细表>)

这里说明下,下面的代码仅仅只是对FK里面的列是一对一的有效,如果是多对多的FK需要修改下面的0的地方为循环即可。

<% for (int c = 0; c < ThisIsTable.ForeignKeys.Count; c++) { %>

外键<%= c %>:<%= ThisIsTable.ForeignKeys[c].Name %>

    外键<%= c %>对应的列

    <% for (int i = 0; i < ThisIsTable.ForeignKeys[c].PrimaryKeyMemberColumns.Count; i++) { %>

        <%= ThisIsTable.ForeignKeys[c].ForeignKeyTable.Name %>.<%= ThisIsTable.ForeignKeys[c].ForeignKeyMemberColumns[0].Name %> <——来自于 <%= ThisIsTable.ForeignKeys[c].PrimaryKeyTable.Name %>.<%= ThisIsTable.ForeignKeys[c].PrimaryKeyMemberColumns[0].Name %>

    <% } %>

<% } %>

 输出结果:

外键0:FK_Student_Class

    外键0对应的列

 

I.        遍历TableFK(Table自己是主键表<Table为父表>)

<% for (int c = 0; c < ThisIsTable.PrimaryKeys.Count; c++) { %>

其他表外键<%= c %>:<%= ThisIsTable.PrimaryKeys[c].Name %>

    其他表外键<%= c %>对应的列:

    <% for (int i = 0; i < ThisIsTable.PrimaryKeys[c].PrimaryKeyMemberColumns.Count; i++) { %>

        <%= ThisIsTable.PrimaryKeys[c].PrimaryKeyTable.Name %>.<%= ThisIsTable.PrimaryKeys[c].PrimaryKeyMemberColumns[0].Name %> 作用于——> <%= ThisIsTable.PrimaryKeys[c].ForeignKeyTable.Name %>.<%= ThisIsTable.PrimaryKeys[c].ForeignKeyMemberColumns[0].Name %>

    <% } %>

<% } %>

输出结果:

其他表外键0:FK_ExamScore_Student

    其他表外键0对应的列:

        Student.ID 作用于——> ExamScore.StudentID

四、            函数区域用法

之前我们提到过,有些参数必须要写在函数区域中。当然这些参数就是需要有一些其他组件支持的参数了,比如弹出一个窗口选择文件,或者弹出一个选择文件夹的窗体,用于输入的参数。

1)    添加一个选择目录的输入参数

下面我们就是定义了一个输入参数OutputDirectory,在运行的输入参数界面,点击这个参数的输入框就会弹出一个选择目录的窗口。

    private string templateOutputDirectory = "";

   

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

    [Optional, NotChecked]

    [Category("OutputInfo")]

    [Description("输出结果的目录。")]

    [DefaultValue("")]

    public string OutputDirectory

    {

        get

        {

            if (string.IsNullOrEmpty(templateOutputDirectory))

            {

                return "C://"+ (ThisIsDatabase!= null ? ThisIsDatabase.Name : "Output");

            }

            else

            {

                return templateOutputDirectory;

            }

        }

        set

        {

            if (value.EndsWith("//")) value = value.Substring(0, value.Length - 1);

            templateOutputDirectory = value;

        }

    }

 

2)    添加一个选择文件的输入参数

下面我们就是定义了一个输入参数OutputFile,在运行的输入参数界面,点击这个参数的输入框就会弹出一个选择文件的窗口。

    private string templateOutputFile;

   

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

    [Optional, NotChecked]

    [Category("OutputInfo")]

    [Description("输出文件")]

    [DefaultValue("")]

    public string OutputFile

    {

        get

        {

            if (string.IsNullOrEmpty(templateOutputFile))

            {

                return "C://"+ (ThisIsDatabase != null ? ThisIsDatabase.Name + ".cs" : "Output.cs");

            }

            else

            {

                return templateOutputFile;

            }

        }

        set

        {

            templateOutputFile = value;

        }

    }

 

3)    将数据库类型转化为C#类型的函数

输入DbType的类型转化后输出C#的类型的字符串。这个函数很常用到。

    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 "DateTime";

               

            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";

        }

    }

 

 

4)    获取数据库类型的字段在C#中的默认值

输入DbType的类型转化后输出C#的类型的默认值。这个函数和上面那个差不多,只是有些时候设置了值后希望给个默认值而已。

    public string DataTypeDefaultValue(System.Data.DbType dbType)

    {

        switch (dbType)

        {

            case DbType.AnsiString:

                return "String.Empty";

            case DbType.AnsiStringFixedLength:

                return "String.Empty";

            case DbType.Binary: //Answer modified was just 0

                return "new byte[] {}";

            case DbType.Boolean:

                return "false";

            case DbType.Byte: //Answer modified was just 0

                return "(byte)0";

            case DbType.Currency:

                return "0";

            case DbType.Date:

                return "DateTime.MinValue";

            case DbType.DateTime:

                return "DateTime.MinValue";

            case DbType.DateTime2:

                return "DateTime.MinValue";

            case DbType.DateTimeOffset:

                return "DateTime.MinValue";

            case DbType.Decimal:

                return "0.0m";

            case DbType.Double:

                return "0.0f";

            case DbType.Guid:

                return "Guid.Empty";

            case DbType.Int16:

                return "(short)0";

            case DbType.Int32:

                return "(int)0";

            case DbType.Int64:

                return "(long)0";

            case DbType.Object:

                return "new object()";

            case DbType.SByte:

                return "(sbyte)0";

            case DbType.Single:

                return "0F";

            case DbType.String:

                return "String.Empty";

            case DbType.StringFixedLength:

展开阅读全文

  • 点赞 1
  • 评论 3
  • 分享
    x

    海报分享

    扫一扫,分享海报

  • 收藏
  • 手机看

    分享到微信朋友圈

    x

    扫一扫,手机阅读

    • 文章举报
  • 关注
收起全文

Codesmith7.0(图文教程, 绝对成功)

03-07
CodeSmith 是一种基于模板的代码生成工具,它 使用类似于 ASP.NET 的语法来生成任意类型的代码或文本。与其他许多代码生成工具不同, CodeSmith 不要求您订阅特定的应用程序设计或体系结

mapdigit

10-24 76

CodeSmith 使用教程(1): 概述

前面正在介绍hibernate的开发 教程,提到hibernate 在.Net 平台上相应的ORM工具为NHibernate , 使用NHibernate 就不能不提到 CodeSmithCodeSmith 是一种基于模板的代码生成工具,它 使用类似于 ASP.NET 的语法来生成任意类型的代码或文本。与其他许多代码生成工具不同, CodeSmith 不要求您订阅特定的应用程序设计或体系结构。......
还能输入1000个字符

mapdigit

01-08 33

CodeSmith 使用教程(5): 基本语法-使用注释

在模板中可以添加注释,注释通过<%–和–%>块来定义,注释可以有多行。比如:<%--Name: TestHarness.cstDescription: Generates a standard test harness for an object--%>如果在代码模板中 使用C#,VB.Net或是JavaScripts脚本,可以 使用使用语言对应的注释,比如C#......

【大BUG】的博客

05-08 1万+

CodeSmith激活教程【适用任意版本】

非原创,我在百度贴吧看到的破解 教程  原文地址http://tieba.baidu.com/p/3373160396?traceid=仅供学习 使用,请支持正版第一步:下载好安装包,记住版本号 第二步:安装好 codesmith第三步:下载好注册机(也就是破解工具)点击下载破解工具  解压密码 502第四步:启动注册机(注意修改对应版本, codesmith是7.0改为CS7......

spw55381155的博客

11-16 815

CodeSmith教程

https://www.cnblogs.com/Bear-Study-Hard/archive/2005/12/19/300112.html

mapdigit

01-06 40

CodeSmith 使用教程(2): 编写第一个代码模板

CodeSmith 使用 教程(1): 概述我们通过 使用 CodeSmith从数据库自动生成NHiberate代码,可以了解到 使用 CodeSmith自动生成代码的基本步骤:选择 使用合适的模板, CodeSmith随开发包自带了大量常用的模板,如果找不到合适的模板, CodeSmith支持自定义模板。为模板选择合适的参数设置。自动生成代码(可以为任意类型的代码,C#,Java, .XML 文本等)......

sjsm2007的专栏

01-08 1251

CodeSmith基础教程

请大家耐心看完所有的基础文章,前两篇网上发表的比较多,是 CodeSmith英文帮助文档的第一篇,我后面写的基础是将其他所有的英文帮助全部翻译出来了,全部为本人手写翻译,希望对大家有所帮助一、第一个模板        创建好一个模板后第一步要指明这是一个C#语言的模板。      Description="Generates a class including a spe...

CodeSmith中文教程(全)

01-30
CodeSmith是很强大的代码生成工具,可以生成C#、VB、JS,支持图形化操作,连接数据库、 使用集合类型,甚至可以在生成时,利用c#、vb、js方法处理数据,得到更贴切的结果。自成一套标签规则,可

五加乘

06-15 695

CodeSmith使用教程

http://terrylee.cnblogs.com/archive/2005/12/28/306254.aspx

mapdigit

01-11 47

CodeSmith 使用教程(6): 基本语法-声明和使用属性

CodeSmith的核心是模板,而使模板具有活力的就是属性,通过定义属性从而使代码模板能够根据配置生成所需的代码。在 使用代码模板时首先也必须给模板定义的属性定义值才能 使用 CodeSmith通过模板产生代码。有些属性具有缺省值,这些属性可以不需要配置。模板中的属性通过Property指令来定义:<%@ Property Name="ClassName" Type="String" Defa......

剑胆琴心-.Net 学习笔记

10-14 2254

CodeSmith使用方法

1、按Ctrl+Shift+D调出Schema Explorer,设置数据源2、编写 CodeSmith模版3、点击Build进行调试      例:实体类模板-------------------------------%>table" Type="SchemaExplorer.TableSchema" Optional="True" Category="C

mapdigit

01-23 40

CodeSmith 使用教程(13) 调试

编写 CodeSmith模板和编写程序一样,也需要进行调试, CodeSmith支持 使用CLR’s Just-in-Time debugger调试模板。要调试模板,首先要在CodeTemplate声明中打开调试Debug=”True”:<%@ CodeTemplate Language="C#" TargetLanguage="C#" Debug="True" %>第二步......

weixin_34244102的博客

06-14 43

黄聪:如何使用CodeSmith批量生成代码(原创系列教程)

在上一篇我们已经用PowerDesigner创建好了需要的测试数据库,下面就可以开始用它完成批量代码生成的工作啦.下面我会一步步的解释如何用 CodeSmith实现预期的结果的,事先声明一下,在此只做一个简单的Demo,并不详细的讲解 CodeSmith各个强大的功能,有兴趣的朋友可以打开 CodeSmith的帮助文档了解.我只做个抛砖引玉,希望能激起大家更多思想的火花~先看看 CodeSmith......

weixin_33893473的博客

01-12 117

CodeSmith使用心得

 代码生成器大家都用过吧, CodeSmith我想大家也不陌生。最近就用 CodeSmith生成了自己的实体类。当然你也可以用它来生成HTML页面以及文档。 下面我就来说一说我生成实体类的步骤: 一、首先介绍一下 CodeSmith 2.6, CodeSmith 2.6安装后,会有3个exe: 1.       CodeSmith.exe即为 CodeSmith Explorer,可视化生成代码工具,免......

mapdigit

01-07 33

CodeSmith 使用教程(4): 基本语法-CodeTemplate 指令

前面的几篇介绍了 使用 CodeSmith模板自动生成代码和编写代码模板的基本知识。也说过 CodeSmith最核心的部分是代码模板,从本篇开始介绍 CodeSmith代码模板的基本语法,对于Asp.Net程序员来说,可以说是碰到老朋友了:-) , CodeSmith 的代码模板和Asp.Net Page 几乎如出一辙。本篇介绍CodeTemplate指令,这个是模板中唯一必须的声明,包含一些模板特殊的属......

bcbobo21cn的专栏

12-05 4631

codesmith学习总结

code smith 使用介绍   利用 CodeSmith为SQL Server CE生成项目代码 摘要: CodeSmith是很多.NET开发人员至爱的开发辅助工具,它能够使开发人员从大量枯燥无味的重复编码中解脱,集中精力解决实际业务问题和技术问题。本文将介绍如何将 CodeSmith用于Windows Mobile项目,以SQL Server Compact Edition数据库作...

weixin_30478923的博客

12-24 44

CodeSmith 基础教程

〇、 前言最近两天自己写了个简单的ORM框架,非常的Easy,但是没有相应的代码生成工具,于是就很杯具了!于是乎,花费了一天的时间学习并写了一个 CodeSmith可以 使用的模板。在此记录下 CodeSmith的学习笔记。所用工具: CodeSmith Professional v5.1.3.8510,代码示例全部是以C#为例。一、......

程序员的兼职技能课

04-24
获取讲师答疑方式: 在付费视频第一节(触摸命令_ALL)片头有二维码及加群流程介绍 限时福利 原价99元,今日仅需39元!购课添加小助手(微信号:csdn590)按提示还可领取价值800元的编程大礼包! 讲师介绍: 苏奕嘉 前阿里UC项目工程师 脚本开发平台官方认证满级(六级)开发者。 我将如何教会你通过【定制脚本】赚到你人生的第一桶金? 零基础程序定制脚本开发课程,是完全针对零脚本开发经验的小白而设计,课程内容共分为3大阶段: ①前期将带你掌握Q开发语言和界面交互开发能力; ②中期通过实战来制作有具体需求的定制脚本; ③后期将解锁脚本的更高阶玩法,打通任督二脉; ④应用定制脚本合法赚取额外收入的完整经验分享,带你通过程序定制脚本开发这项副业,赚取到你的第一桶金!

Windows版YOLOv4目标检测实战:训练自己的数据集

04-26
课程演示环境:Windows10; cuda 10.2; cudnn7.6.5; Python3.7; VisualStudio2019; OpenCV3.4 需要学习ubuntu系统上YOLOv4的同学请前往:《YOLOv4目标检测实战:训练自己的数据集》 课程链接:https://edu.csdn.net/course/detail/28745 YOLOv4来了!速度和精度双提升! 与 YOLOv3 相比,新版本的 AP (精度)和 FPS (每秒帧率)分别提高了 10% 和 12%。 YOLO系列是基于深度学习的端到端实时目标检测方法。本课程将手把手地教大家使用labelImg标注和使用YOLOv4训练自己的数据集。课程实战分为两个项目:单目标检测(足球目标检测)和多目标检测(足球和梅西同时检测)。 本课程的YOLOv4使用AlexyAB/darknet,在Windows系统上做项目演示。包括:安装软件环境、安装YOLOv4、标注自己的数据集、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计(mAP计算)和先验框聚类分析。还将介绍改善YOLOv4目标检测性能的技巧。 除本课程《Windows版YOLOv4目标检测实战:训练自己的数据集》外,本人将推出有关YOLOv4目标检测的系列课程。请持续关注该系列的其它视频课程,包括: 《Windows版YOLOv4目标检测实战:人脸口罩佩戴检测》 《Windows版YOLOv4目标检测实战:中国交通标志识别》 《Windows版YOLOv4目标检测:原理与源码解析》

lena全身原图(非256*256版本,而是全身原图)

03-10
lena全身原图(非256*256版本,而是全身原图) lena原图很有意思,我们通常所用的256*256图片是在lena原图上截取了头部部分的256*256正方形得到的. 原图是花花公子杂志上的一个
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页

你可能感兴趣的:(codeSmith的使用教程)