CodeSmith终极玩法

CodeSmith是一个模仿asp.net运行机制的代码生成器,  运行时分析模板(相当aspx文件)的预编译指令和主体内容, 生成一个继承自CodeSmith.Engine.CodeTemplate(相当于System.Web.UI.Page)或者一个在Inherites预编译指令指定的类(相当于CodeBehind类)的源码, 且把它编译. 然后把这个类绑定到一个PropertyGrid, 让用户编辑参数后执行生成类的__RenderMethod1(相当于Render)方法生成最终代码. 这种模式很好的把易变的生成内容和相对稳定的用于的生成代码的数据源隔离开来.

我认识的大多数CodeSmith用户都是根据数据库结构去生成实体类, 存储过程或者asp.net的界面, 而CodeSmith本身提供了SchemaExplorer用于读取数据库结构, 在模板的预编译指令声明类型为SchemaExplorer.TableSchema的属性即可使用. 而大多数模板都是利用SchemaExplorer去获得数据库结构.

PropertyGrid是用户和根据模板生成的类之间互动的桥梁, 通过在属性或者属性所属类型上标记EditorAttribute可以任意扩展该属性在PropertyGrid里的表现形式, 详细情况请参考http://www.microsoft.com/china/msdn/archives/library/dndotnet/html/usingpropgrid.asp

然而CodeSmith并不支持在模板里定义的属性标记Attribute, 即使有, 在CodeSmithStudio里写这么复杂的代码也不方便. 解决方法就是自己在vs.net写一个模板的基类(必须从CodeSmith.Engine.CodeTemplate继承), 然后通过指定Inherites关键字让模板从基类继承, 这时就可以利用EditorAttribute为所欲为了. 我做了一个可以用来生成多个nhibernate实体类, xml映射和aspx界面的模板基类, 还可以把填写的内容序列化到xml文件和从xml文件反序列化. 我并没有用TableSchema去做生成代码的数据源, 而是有自定义的数据结构, 并且可以手工用XtraGrid去编辑, 当然也可以利用SchemaExplorer去从数据库取结构. 这个基类的结构如下:             

ClassGenerator
+ Assembly
+ Namespace
+ Classes
◆------->
0        *
Class 
+ Attributes
+ Comments
+ Fields
◆------->
0        *
 Field
+ Name
+ DataType
+ MappingType
+ AllowNull
    ......


ClassGenerator还有3个特殊属性SelectedClasses, Save, Load. 它们没有任何意义, 只是利用它们标记的EditorAttribute执行用SchemaExplorer一次选择多个表, 把编辑的内容保存成xml和从xml加载的功能

cst1.PNGcst2.PNGcst3.PNG

源码及模板

btw: 我用XtraGrid时遇到问题, 删除一列时被选中列就会往后跳一条, 结果就是删到倒数第二条时会出现索引超出范围的错误, 谁知道怎么解决?

转载于:https://www.cnblogs.com/Yok/archive/2005/06/23/179938.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464532.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bom与dom

区别 BOM(Browser Object Model) BOM 即浏览器对象模型,BOM没有相关标准,BOM的最核心对象是window对象。window对象既为javascript访问浏览器提供API,同时在ECMAScript中充当Global对象。BOM和浏览器关系密切&#xff…

Service 的生命周期;两种启动方法和区别

1:startService Service的生命周期:onCreate() --> onStart() -> onDestroy() 停止服务:service.stopService() 2:bindService Service的生命周期 onCreate() --> onBind() --> onUnBind() --> onDestroy() 停止…

用反射简化 asp.net 报表的一点总结

有几个报表, 查询条件都一样,仅仅里面GridView中有几个列区别,以前图快,就把原来Report.aspx文件拷贝一份,改名为Report1.aspx,然后,修改里面的column,然后再由后台库查出数据,填充到…

超轻型的数据库sqlite

很多次看到别人提到这个东西,最近因项目需要看了看,确实好用。总共就两个文件,我想不能再简单了。还是开源的。开发rails也可以用,不错!转载于:https://www.cnblogs.com/chenge/archive/2005/06/29/183508.html

有些事不用听别人的

今天在群里跟几个朋友聊天,然后说了自己的想法,最近很多人在说公众号不会有好的发展,写文章也是没有出路的。不过这个是事实。短视频才是可能是出路,短视频是个很大的蛋糕,从表达方式上来说,视频的表达方式…

php读取三维数组,php 读取多维数组方法_PHP教程

php 读取多维数组方法for($i0;$i{for($j0;$j{echo $array[$j][userid];}}因为它是个多维数组,一般用foreach ($arr as $key > $value) {echo "Key: $key; Value: $value\n";}Array ( [0] > Array ( [userid] > 1 [username] > 刘振鹏 [status] > 0 [u…

互斥锁mutex的使用方法

在线程实际运行过程中,我们经常需要多个线程保持同步。这时可以用互斥锁来完成任务;互斥锁的使用过程中,主要有pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlock这几个函…

1000瓶药水,1瓶有毒药,几只小白鼠能够找出毒药

1000瓶药水,1瓶有毒药,服用后一小时毒发,毒药可以无限稀释,那么一小时内用几只小白鼠能够找出毒药? 假如是8瓶药水,3只小白鼠。 0000  0011  0102  0113  1004  1015  1106  1117 每位数表示…

25个优秀的设计机构网站设计案例

今天,我们一起来欣赏网站设计工作室自己的网站。设计公司的网站除了要能够吸引客户以外,还要通过他们自己的网站向客户展示他们的设计理念和风格。这里收集的25个优秀的设计机构网站既有清爽简洁风格的,也有色彩丰富,图文并茂的&a…

windows server 2003 出错提示请求的资源在使用中解决方案

1.杀毒软件造成IIS站点‘请求的资源在使用中’”的消息,如瑞星2005,服务器上使用单机版杀毒一般都不会稳定的。马上把瑞星卸载了,重启机器,一切正常。 2.IUSR_机器名和IWAM_机器名的账号不同步,这个在网上已经有解决方案了只要打开…

一个适用各类场合的Makefile模板

1.写在前面对于Windows下开发,很多IDE都集成了编译器,如Visual Studio,提供了“一键编译”,编码完成后只需一个操作即可完成编译、链接、生成目标文件。Linux开发与Windows不同,Linux下一般用的的gcc/g编译器&#xff…

matlab r2014a错误,MATLAB中的潜在错误使R2014a回归

MATLAB R2014a过去工作得很好w回归但是现在当变量很好并且排名满意时我得到一个错误。X rand([10 3])X 0.8407 0.3517 0.07590.2543 0.8308 0.05400.8143 0.5853 0.53080.2435 0.5497 0.77920.9293 0.9172 0.93400.3500 0.2858 0.12990.1966 0.7572 0.56880.2511 0.7537 0.469…

Android 如何退出整个应用程序?

转载文章:http://blog.csdn.net/sunnyfans/article/details/7688092 Android 怎么退出整个应用程序? 我们在写android应用程序时,经常会遇到想退出当前Acitivity,或者直接退出应用程序.我之前的一般操作是按返回键,或者…

excel拼接数据宏

将sheet2的A2 和 G2 加上 sheet5的A2和B2合一起生成新的sheet--就是将两个sheet的指定列前后拼接一起作为一个新的sheet Sub addwork() Sheets.Add after:Sheets(Sheets.Count) ActiveSheet.Name "临时合并数据" Dim s, sht, shts Dim arr, brr1, br…

关于我曾经做过的一个商业社区的ui框架

1.主页面default2.容器,中间页面process载入模板3.模板:BasePage4,BasePageprotected override void Render(System.Web.UI.HtmlTextWriter writer) {writer.WriteLine("Header");base.Render(writer);writer.WriteLine("Header");}转载于:https://www.cnb…

毕业十年|我的嵌入式AI学习路线(笔记、代码)

嵌入式从业者接下来会有怎样的黄金十年?在物联网和人工智能的促进下,嵌入式在未来的5-10年内会迎来更多的发展机会,一方面嵌入式开发会迎来更多的应用场景,另一方面嵌入式开发的技术体系也会逐渐丰富,从而拓展物联网开…

DAL调用SP时出现的异常处理

三种情形: 1.执行SP时出错,如连接异常,数据库权限异常 2.SP代码中抛出异常 3.返回值/输出参数的值不符合约定 后两种情形需要在异常发生时记录传入SP的参数值;业务逻辑层需要捕获并重抛,以保证UI层提供给用户友好的错误…

在艰苦年代,买不起万用表,怎么测量电路电压?

如何测量电压?有这样一张图片:用舌头来测量?开玩笑的吧!不过这张照片勾起了我的回忆:有一位玩电子的老前辈,现在已经70多岁了。和他聊天,他说,当年他们玩电子,条件非常艰…

71道经典Android面试题,涵盖了所有android知识点,值得学习和思考

1. 下列哪些语句关于内存回收的说明是正确的? (b ) A、 程序员必须创建一个线程来释放内存 B、内存回收程序负责释放无用内存 C、内存回收程序允许程序员直接释放内存 D、内存回收程序可以在指定的时间释放内存对象 2. 下面异常是属于Runtime Excepti…

VBA学习_5:流程控制

1、If If Range("B2").Value >60 Then Range("C2").Value "及格" Else Range("C2").Value"不及格"如果。。。那么。。。。否则。。。。 If Range("B2").Value > 60 ThenRange("C2").Value "…