一直想写一个Code生成系列,但写到CodeSimth,发觉在TerryLee 和努力学习的小熊 两位大牛的博客里讲很详尽,所以就像写些示例方面的,但是苦于没有想到写些什么。最近Artech写了两篇从数据到代码——通过代码生成机制实现强类型编程--上篇和下篇,大牛写得是CodeDom的,今天我就想借借大牛的示例写个CodeSimth版的,希望Artech不要怪我,呵呵。我的Code生成技术已经写了CodeDom的见CodeDom系列目录,欢迎各位园友指教。

好直接到主题。首先是数据实体MessageEntry(我到老A的基础上添加了description属性作为代码字段描述):

代码

1 namespace Wolf 
2 { 
3 public class MessageEntry 
4     { 
5 public string Id { get; private set; } 
6 public string Value { get; private set; }        
7 public string Description { get; private set; } 
8 public MessageEntry(string id, string value) 
9         { 
10 this.Id = id; 
11 this.Value = value;         
12         } 
13
14 public MessageEntry(string id, string value, string description) 
15         { 
16 this.Id = id; 
17 this.Value = value; 
18 this.Description = description; 
19         } 
20
21 public string Format(params object[] args) 
22         { 
23 return string.Format(this.Value, args); 
24         } 
25     } 
26 }
27
28

在我的机子上的COdeSimth是2..0版本的所以不能使用Linq命名空间,我又想利用这个空间,比较快捷,所以我就在先3.0转化为

Dictionary<string, List<MessageEntry>>实体再传入模板:

Code:

代码

1 using System; 
2 using System.Collections.Generic; 
3 using System.Linq; 
4 using System.Text; 
5 using System.Xml; 
6 using System.Xml.Linq; 
7
8 namespace Wolf 
9 { 
10 public class MessageCodeGenerator 
11     { 
12 public Dictionary<string, List<MessageEntry>> GeneratorCode(string  path) 
13         { 
14 return GeneratorCode(XElement.Load(path)); 
15         } 
16 public Dictionary<string, List<MessageEntry>> GeneratorCode(XElement root) 
17         { 
18
19             var elemts = root.Elements("message").GroupBy(e => ((XAttribute)e.Attribute("category")).Value); 
20             Dictionary<string, List<MessageEntry>> dict = new Dictionary<string, List<MessageEntry>>(); 
21 foreach (var item in elemts) 
22             { 
23                 List<MessageEntry> list = new List<MessageEntry>(); 
24 foreach (var g in item) 
25                 { 
26 if (g.Attribute("description") != null) 
27                     { 
28                         list.Add(new MessageEntry(((XAttribute)g.Attribute("id")).Value, ((XAttribute)g.Attribute("value")).Value, ((XAttribute)g.Attribute("description")).Value)); 
29                     } 
30 else
31                     { 
32                         list.Add(new MessageEntry(((XAttribute)g.Attribute("id")).Value, ((XAttribute)g.Attribute("value")).Value)); 
33                     } 
34
35                 } 
36                 dict.Add(item.Key.ToString(), list); 
37             } 
38 return dict; 
39
40         } 
41     } 
42 }
43
44

这下几可开始写模板了,见下Code:

代码

1 <%@ CodeTemplate Language="C#" TargetLanguage="Text" Src="" Inherits="" Debug="False" Description="Template description here." %>
2
3 <%@ Import NameSpace="System" %>
4 <%@ Import NameSpace="System.Xml" %>
5 <%@ Import NameSpace="System.Text" %>
6 <%@ Import NameSpace="System.Collections.Generic" %>
7 <%@ Import NameSpace="Wolf" %>
8 <%@ Assembly Name="Wolf" %>
9
10 <script runat="template">
11
12 private Dictionary<string, List<MessageEntry>> dict; 
13 public Dictionary<string, List<MessageEntry>> Generator 
14 { 
15 get
16     { 
17 return dict; 
18     } 
19 set
20     { 
21         dict=value; 
22     } 
23 } 
24
25 public string GeneratorCode() 
26         {            
27 string str = "using Wolf;\r\nusing System;\r\nusing System.Collections.Generic;\r\nnamespace Wolf.Message\r\n{ \r\n   public class Messages\r\n    {\r\n"; 
28 foreach (string catage in Generator.Keys) 
29             { 
30                 str += "        public class  "+catage + "\r\n        {        \r\n"; 
31 foreach (Wolf.MessageEntry entry in Generator[catage]) 
32                 { 
33                     str += "\r\n            /// <summary>" +
34 "\r\n            ///" + entry.Description +
35 "\r\n            /// </summary>" +
36 "\r\n            public static Wolf.MessageEntry " + entry.Id + " = new MessageEntry(\"" + entry.Id + "\", \"" + entry.Value +"\", \"" + entry.Value +"\");\r\n"; 
37                 } 
38                 str += "\r\n        }\r\n\r\n"; 
39
40             } 
41             str += "\r\n    }\r\n}"; 
42 return str; 
43         } 
44
45 </script>
46 //Copyright (C) Wolf.  All rights reserved. 
47 <%=  GeneratorCode()%>
48
49

很简单,就不说了,如果有问题请留言,其中命名空间完全可以以属性方式传入。

XMl实体用的是老A的:

代码

1 <?xml version="1.0" encoding="utf-8" ?>
2 <messages>
3 <message id="MandatoryField" value="The {0} is mandatory."  category="Validation"  description="description" />
4 <message id="GreaterThan" value="The {0} must be greater than {1}."  category="Validation" description="description" />
5 <message id="ReallyDelete" value="Do you really want to delete the {0}."  category="Confirmation" description="description" />
6 </messages>
7
8

我想脱离CodeSimth工具,所以在建立了一个控制台程序,引用CodeSmith.Engine.dll程序集。

Code:

代码

1 static void Main(string[] args) 
2        { 
3 // Wolf.Message.Messages.Confirmation.ReallyDelete.Value 
4 // test(); 
5            CodeTemplate template = CompileTemplate(@"E:\MyApp\LinqTest\ConsoleApplication1\MessageCodeGenerator.cst",s=>Console.WriteLine(s)); 
6 if (template != null) 
7            { 
8                template.SetProperty("_MessageFilePath", ""); 
9                Wolf.MessageCodeGenerator gen = new MessageCodeGenerator(); 
10                Dictionary<string, List<MessageEntry>> dict = gen.GeneratorCode(@"E:\MyApp\LinqTest\ConsoleApplication1\Sample.xml"); 
11                template.SetProperty("Generator", dict); 
12                template.RenderToFile("gen.cs", true); 
13 // System.Diagnostics.Process.Start("gen.cs"); 
14            } 
15 // Console.Read(); 
16
17        }
18
19 public static CodeTemplate CompileTemplate(string templateName,Action<string> errorWriter) 
20        { 
21            CodeTemplateCompiler compiler = new CodeTemplateCompiler(templateName); 
22            compiler.Compile(); 
23
24 if (compiler.Errors.Count == 0) 
25            { 
26 return compiler.CreateInstance(); 
27            } 
28 else
29            { 
30 for (int i = 0; i < compiler.Errors.Count; i++) 
31                { 
32                    errorWriter(compiler.Errors[i].ToString()); 
33                } 
34 return null; 
35            } 
36
37        }
38
39

生成后的代码:

代码

1 //Copyright (C) Wolf.  All rights reserved. 
2 using Wolf; 
3 using System; 
4 using System.Collections.Generic; 
5 namespace Wolf.Message 
6 { 
7 public class Messages 
8     { 
9 public class Validation 
10         { 
11
12 /// <summary>
13 ///description 
14 /// </summary>
15 public static Wolf.MessageEntry MandatoryField = new MessageEntry("MandatoryField", 
16
17 "The {0} is mandatory.", "The {0} is mandatory."); 
18
19 /// <summary>
20 ///description 
21 /// </summary>
22 public static Wolf.MessageEntry GreaterThan = new MessageEntry("GreaterThan", 
23
24 "The {0} must be greater than {1}.", "The {0} must be greater than {1}."); 
25
26         } 
27
28 public class Confirmation 
29         { 
30
31 /// <summary>
32 ///description 
33 /// </summary>
34 public static Wolf.MessageEntry ReallyDelete = new MessageEntry("ReallyDelete", 
35
36 "Do you really want to delete the {0}.", "Do you really want to delete the {0}."); 
37
38         } 
39
40     } 
41 }
42
43

通过代码生成机制实现强类型编程-CodeSimth版相关推荐

  1. 从数据到代码——通过代码生成机制实现强类型编程[上篇]

    我不知道大家对CodeDOM的代码生成机制是否熟悉,但是有一点可以确定:如果你使用过Visual Studio,你就应该体验过它带给我们在编程上的便利.随便列举三种典型的代码生成的场景:在创建强类型D ...

  2. 采用SpringBoot、MyBatis-Plus 、Security框架,开发的一套权限系统,实现前后端分离,完善的代码生成机制

    项目说明 harry 采用SpringBoot.MyBatis-Plus .Security框架,开发的一套权限系统,实现前后端分离,完善的代码生成机制.Harry Gitee地址 harry-vue ...

  3. 拒绝从入门到放弃_《Python 核心编程 (第二版)》必读目录

    目录 目录 关于这本书 必看知识点 最后 关于这本书 <Python 核心编程 (第二版)>是一本 Python 编程的入门书,分为 Python 核心(其实并不核心,应该叫基础) 和 高 ...

  4. python核心编程第二版pdf_Python Book电子书pdf版合集 Python核心高级编程第二版

    1小时学会Python.doc 51CTO下载-[Python系列].BeginningPythonFromNovicetoProfessionalSecondEdition.pdf 8.Python ...

  5. shell脚本编程for循环求阶乘_shell脚本编程(完结版).pdf

    shell脚本编程(完结版) Shell 脚本编程学习笔记 2013 年 5 月 2 日 追风~忆梦 如有任何疑问,请联系作者,作者 QQ:1028150787,或者到韦东山群共同讨论 1 Shell ...

  6. python核心教程第二版答案_python核心编程第二版第4章习题答案.docx

    python核心编程第二版第4章习题答案.docx 4-1.Python 对象.与所有 Python 对象有关的三个属性是什么?请简单的描述一下. 答案: 所有的 Python 对象都拥有三个特性:身 ...

  7. python编程 迷你世界_迷你编程电脑版|迷你世界迷你编程下载 v1.0官方版 - 绿点软件站...

    迷你世界迷你编程是一款简单易学图形化编程软件,软件采用图形化的编程方式,过程就像组合积木一样简单,不但可以帮助青少年学习基础的编程知识,也提高了数学逻辑思维能力,还可以让孩子们感受到创造三维立体世界的 ...

  8. 弯管机编程软件电脑版_奥信编程电脑版

    奥信编程电脑版是一款相当优秀的编程学习软件,软件拥有丰富的教学资料,用户可以选择课程零基础开始学习,适合中小学生学习C++语言,1000多道基础选择题,各种算法题解,c++. 软件特色 编程论坛 讨论 ...

  9. 扇贝python编程课_扇贝编程app下载-扇贝编程手机版python「附如何设置自由职业」 - 超好玩...

    扇贝编程app是一款学程序的初学者们都爱用的编程学习软件,软件汇集从入门到应用一应俱全.扇贝编程手机版python「附如何设置自由职业」常见的编程语言及技术教程,学习查询两不误!更有专业的编程导师手把 ...

最新文章

  1. 水果电商小程序云开发,从零到上线投入使用
  2. WPF 模仿IconPacks库写图标按钮
  3. python基本对象类型
  4. 小程序 css框架,微信小程序_如何支持Less等CSS框架开发
  5. python——zip()、map()、enumerate()、filter()、apply函数
  6. 有序数组中的h引用 H-Index II
  7. linux中recv函数,为什么recv()函数收到空消息?
  8. Linux和Windows文件实时同步
  9. 简单的VB进度条程序
  10. vmware workstation 16 安装centos7 全记录(文字版)
  11. 怎么使用quicktime
  12. 腾讯云网站域名备案帮助说明文档
  13. 9月18日博文阅读数异常波动公告
  14. amd显卡风扇调节_AMD Crimson驱动会烧毁显卡?其实是因为风扇锁定低转速了
  15. 2015-2016 ACM-ICPC, NEERC, Moscow Subregional Contest G题: Garden Gathering [线段树/最小曼哈顿距离生成树]
  16. 【二维码】新浪开放平台和腾讯开放平台试水
  17. Kubernetes详解
  18. DNA-蛋白翻译过程的Python实现
  19. 重学计算机(六、程序是怎么运行的)
  20. r语言 读服务器数据,R语言数据实战 | 安装R语言

热门文章

  1. 信息学奥赛一本通 1094:与7无关的数 | OpenJudge NOI 1.5 39
  2. 29 FI配置-财务会计-外币评估-分配到评估范围和会计核算原则
  3. android ndk 智能指针,智能指针与弱引用详解
  4. Centos系列 Curl error (37): Couldn‘t read a file:// file for file:///etc/pki/rpm-gpg/RPM-GPG-KEY-XXXX
  5. model 提交表信息java,Angular6+antd+java+SpringMVC,表单提交自动接收模型对象?
  6. android 验证码图片识别_图片验证码的识别技术
  7. bash 将二进制转换为十进制_一文帮你详细图解二进制、八进制、十进制、十六进制之间的转换...
  8. linux内核那些事之 VMA Gap
  9. 目标检测网络中的 bottom-up 和 top-down理解
  10. Bootstrap完美select标签下拉菜单实现