深入浅出.NET代码生成系列(2):一些基本类
来源:互联网 发布:post 传递json 编辑:程序博客网 时间:2024/05/22 11:51
既然叫“深入浅出”了,那我们先来深一下,好吧?
一、用到了哪些命名空间?
说白了,基本上与代码生有关的类都在System.CodeDom命名空间和System.CodeDom.Compiler。不知道各位对这两个命名空间熟悉指数是多少?
二、CodeDomProvider类
该类位于System.CodeDom.Compiler命名空间下,它是一个抽象类,有朋友可以疑问了,这……这是个抽象类,那是不是不能new实例?是D。
既然是抽象类,那么一定有子类来实现它的,那么实现CodeDomProvider的子类在哪?哈,那个类在Microsoft.CSharp命名空间下,叫CSharpCodeProvider,不信?看看下面的图片。
如果还不信,来,你创建一个控制台应用程序,然后执行以下代码,看看结果是啥?
var cpr = CodeDomProvider.CreateProvider("C#"); Console.WriteLine(cpr.GetType().ToString());
大家都看到了,CodeDomProvider是通过调用静态方法CreateProvider来创建实例,其中的字符串参数就是语言的名字,如“C#”,用“cs”、“CSharp”都可以。
那么,如果要生成的代码是VB.NET,那么它调用CreateProvider方法后又返回了什么呢?请看下面的代码。
var cpr = CodeDomProvider.CreateProvider("VB"); Console.WriteLine(cpr.GetType().ToString());
呵呵,再执行一下,看看有什么?这次不用我介绍了吧。
为什么要介绍CodeDomProvider类,因为它太重要了,它相当于“孕妇”,要生成的代码相当于“待出生的孩子”,嗯,有这个比喻,你大致明白它的用途了,对啊,我们要生成代码,就是要用到它的N个方法,比如:
(1)GenerateCodeFromCompileUnit:从CodeCompileUnit生成代码;
(2)GenerateCodeFromExpression:从CodeExpression生成代码;
(3)GenerateCodeFromMember:从CodeTypeMember生成代码;
(4)GenerateCodeFromNamespace:从CodeNamespace生成代码;
(5)GenerateCodeFromStatement:从CodeStatement生成代码;
(6)GenerateCodeFromType:从CodeTypeDeclaration生成代码。
这些方法就不介绍了,打开“对象浏览器”就看到了。
接下来要说上面几个方法中出现几位新“哥们”,其实你发现上面那堆方法都是兄弟,看着都像。上面提及的那堆东西都在System.CodeDom命名空间下。
三、CodeCompileUnit类
该类派生自CodeObject类,属于CodeDom文档对象。CodeCompileUnit可以称为一个“代码单元”,是一个容器,但是,貌似理论上的东西不好理解,但我们看到,CodeCompileUnit类可以包含程序集特性,也可以包含其它程序集的引用集合,包含N个命名空间,或者,我们可以把它理解为一个程序集。
四、CodeNamespace类
看名字就知道这个家伙是干哪行的。它表示代码中的命名空间,Imports属性表示要引入的命名空间,如C#中的using System。Types属性包括命名空间中定义的类型集合,如类、结构等。
五、CodeExpression类
这是代码表达式的基类,如a = b;
六、CodeStatement类
代码描述的基类,代码描述块包括多个表达式,在C#中可以理解为{和}之间的语句。
七、CodeTypeMember类
提供类型成员的基类,如方法、属性、事件等。
八、CodeTypeDeclaration类
表示类、结构、接口或枚举等声明。如
public class A { }
好了,看看上面的内容,深不深?大家觉得?哈哈,还是有点枯燥,这样吧,下面我们来“浅”一下哦。
=> 如何生成定义命名空间的代码
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.CodeDom;using System.CodeDom.Compiler;namespace SampleApp{ class Program { static void Main(string[] args) { // 定义命名空间的CodeDom对象 CodeNamespace MyNameSpace = new CodeNamespace("MyApplication"); // 创建代码生成提供对象 Console.Out.WriteLine("\n--------- 以下是C#代码 ------------"); // C# CodeDomProvider CSProvider = CodeDomProvider.CreateProvider("C#"); CSProvider.GenerateCodeFromNamespace(MyNameSpace, Console.Out, new CodeGeneratorOptions { BracingStyle = "C" }); Console.Out.WriteLine("\n\n------- 以下是VB.NET代码 -----------"); // VB CodeDomProvider VBProvider = CodeDomProvider.CreateProvider("VB"); VBProvider.GenerateCodeFromNamespace(MyNameSpace, Console.Out, new CodeGeneratorOptions()); Console.ReadKey(); } }}
上面代码中,调用CodeDomProvider的GenerateCodeFromXXX方法时,其中第三个参数为一个CodeGeneratorOptions对象,它用作代码生成的选项,BracingStyle属性表示C#中大括号的样式,有两个值“C”表示大括号都占一行;“Block”则不是。看看下面两张图就明白了。
好,现在看看上面的代码执行后是啥结果。
- 深入浅出.NET代码生成系列(2):一些基本类
- 深入浅出.NET代码生成系列(1):概述
- 深入浅出.NET代码生成系列(3):命名空间
- 深入浅出.NET代码生成系列(4):定义类型
- 深入浅出.NET代码生成系列(5):表达式
- 深入浅出.NET代码生成系列(6):语句
- 深入浅出.NET代码生成系列(7):动态生成代码与编译综合示例
- Shell编程基础系列(2)------一些基本的命令
- .Net xsd工具生成C#代码的一些方式
- .Net一些基本语言特性(一)
- HTML一些基本代码
- ASP.NET AJAX深入浅出系列课程
- ASP.NET AJAX深入浅出系列课程
- ASP.NET程序中常用的基本代码(2)
- ASP.NET生成缩略图类C#代码
- .NET代码生成工具
- 一些常用.NET代码~
- 深入浅出SQL系列教程之基本SELECT命令
- 黑马程序员--面试题之---交通管理系统
- 多态分类
- 面试杂项题
- mysql数据库链接以及对数据库操作方法
- ANSI、Ascii的编码及VC编程
- 深入浅出.NET代码生成系列(2):一些基本类
- 带你理解JavaScript中的闭包
- ulink 、 jlink 、 openjtag 区别
- oracle数据库表分区
- 不要丢失自己
- 请阅读以下一段程序,并给出答案
- 基于mvc 的邮件发送
- 《C/C++函数与算法速查手册》重印了,这本书从C语言函数C++函数讲解,然后是算法等讲解
- android 应用退出时释放应用所占内存