zoukankan      html  css  js  c++  java
  • 调用CodeSmith类库实现代码生成(含源码)

          CodeSmith的作用是不言而喻的,用过的人都会觉得它非常强大.根据自定义模板,快速生成代码.只是我们使用的时候,要在它提供的CodeSmith Studio环境下使用模板,再传入相应参数,最终生成NET的类文件.

          如果我们可以通过编码方式,把CodeSmith功能融入NET代码中,这样就会比较灵活,方便我们控制了.根据下面的操作步骤我们就可以实现.

          先说下环境,我安装的CodeSmith版本是5.1,当然是破解版(你懂的).居说CodeSmith注册费用还是比较昂贵滴.我们需要如下几个DLL文件,这几个文件在安装路径下都可以找到.

    CodeSmith.Engine.dll

    CodeSmith.Feedback.Client

    SchemaExploer.dll

    SchemaExploer.SqlSchemaProvider.dll

          把这几个DLL文件引入项目文件之后,接下来就需要制作模板了,我们也可以直接使用CodeSmith自带的模板.打开CodeSmith Studio,右侧就是Template Exploer部分,选择一个模板,右键,选择Open Folder In Window Exploer菜单项,确定好模板路径后,就可以开始编码了.

          在写代码之前,我们还是先看下模板的组成,如图-1所示

    clip_image002

    图-1

          代码第2句,Property关键字,就表示这个模板的属性,也是需要我们传入的参数,看类型是SchemaExploer.DataBaseSchema,也就是说,我们只要传入这个类型的参数值即可

    代码如图-2所示

    clip_image004

    图-2

          代码非常简单,先要加载模板再编译,然后传入属性值,再输出就OK了.模板编译部分是CompileTemplate方法,如图-3所示

    clip_image006

    图-3

    传入属性值的代码是CodeTemplate.SetProperty;

    输出类文件的代码是RenderToFile;

          OK,整个过程结束,看看我们的成果吧,如图-4所示

    clip_image007

    图-4

          这个模板的作用是生成Db数据库中所有Db表的枚举类.

          编码方式使用CodeSmith还是非常灵活的,比如我想生成数据库中Db表的CreateSQL语句,以前我们可能是自己拼写字符串实现,现在使用CodeSmith模板,就非常简单了.如图-5所示,大家参考这个代码自己试下,是不是非常简单呢?

    clip_image009

     图-5

    完整代码如下

    //引入的命名空间
    //using SchemaExplorer;
    //using System.CodeDom;
    //using System.CodeDom.Compiler;
    
            /// <summary>
            /// 编译CodeSmith模板
            /// </summary>
            /// <param name="templateName"></param>
            /// <returns></returns>
            public CodeSmith.Engine.CodeTemplate CompileTemplate(string templateName,ref string errors)
            {
                CodeSmith.Engine.CodeTemplate codeTemplate = null;
    
                //编译器
                CodeSmith.Engine.CodeTemplateCompiler compiler = new CodeSmith.Engine.CodeTemplateCompiler(templateName);
                compiler.Compile();
    
                //判断是否编译成功
                if (compiler.Errors.Count == 0)
                {
                    codeTemplate = compiler.CreateInstance();
                }
                else
                {
                    StringBuilder sbErrors = new StringBuilder();
                    for (int i = 0; i < compiler.Errors.Count; i++)
                    {
                        sbErrors.Append(compiler.Errors[i].ToString());
                    }
                    errors = sbErrors.ToString();
                }
    
                return codeTemplate;
            }
    
            private void btnCodeSmith_Click(object sender, EventArgs e)
            {            
                string errors = string.Empty;
                string templateName = string.Empty;
                CodeSmith.Engine.CodeTemplate codeTemplate = null;
    
                IDbSchemaProvider provider = new SqlSchemaProvider();
                DatabaseSchema dbSchema = new DatabaseSchema(provider, DevelopToolManager.DbConnectionString);
    
                //TableEnum模板
                templateName = @"C:\Program Files\Navi.Kernel\CodeSmith Template\TableEnum.cst";
                codeTemplate = this.CompileTemplate(templateName, ref errors);
                if (string.IsNullOrEmpty(errors))
                {
                    codeTemplate.SetProperty("SourceDatabase", dbSchema);
    
                    string csFileName = @"I:\待整理文件\tableEnum.cs";
                    codeTemplate.RenderToFile(csFileName, true);
                }
    
                //TableSchema模板
                templateName = @"C:\Program Files\Navi.Kernel\CodeSmith Template\TableSchema.cst";
                codeTemplate = this.CompileTemplate(templateName, ref errors);
                if (string.IsNullOrEmpty(errors))
                {
                    TableSchema tableSchema = dbSchema.Tables["AD_AUTHOR"];
                    codeTemplate.SetProperty("SourceTable", tableSchema);
                    codeTemplate.SetProperty("ScriptCreate", "true");
                    //生成字符串
                    string codeTotal = codeTemplate.RenderToString();
                    MessageBox.Show(codeTotal);
                    //生成文件
                    string csFileName = @"I:\待整理文件\TableSchema_AD_AUTHOR.cs";
                    codeTemplate.RenderToFile(csFileName, true);
                }
    
            }
  • 相关阅读:
    LeetCode Medium:15. 3Sum
    LeetCode Medium:12. Integer to Roman
    LeetCode Medium: 11. Container With Most Water
    TypeError: unsupported operand type(s) for /: 'map' and 'int'
    【C#】课堂知识点#4
    【C#】课堂知识点#3
    【统计与建模】R语言基本操作
    【题解】表达式的值
    【题解】瑞士轮
    【题解】道路游戏
  • 原文地址:https://www.cnblogs.com/xiyang1011/p/2330867.html
Copyright © 2011-2022 走看看