`
java-mans
  • 浏览: 11454120 次
文章分类
社区版块
存档分类
最新评论

深入浅出.NET代码生成系列(2):一些基本类

 
阅读更多

既然叫“深入浅出”了,那我们先来深一下,好吧?

一、用到了哪些命名空间?

说白了,基本上与代码生有关的类都在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”则不是。看看下面两张图就明白了。

好,现在看看上面的代码执行后是啥结果。


分享到:
评论

相关推荐

    asp.net知识库

    深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...

    三天循序渐进掌握PyTorch教程(附带完整源码及数据集)

    第四章介绍了PyTorch中神经网络模块nn的基础用法,同时讲解了神经网络中“层”,“损失函数”,“优化器”等,最后带领读者用不到50行的代码搭建出曾夺得ImageNet冠军的ResNet。 第五章介绍了PyTorch中数据加载,GPU...

    ASP.NET MVC4开发指南

    《ASP.NET MVC 4 开发指南》是由台湾知名博客站长与畅销书作者“Will保哥”所撰写的ASP.NETMVC4开发指南,融入作者多年实务开发工作之精髓,从基础观念、技术讲解、开发实例、开发技巧到安装部署,都将以深入浅出的...

    深入解析ATL(第2版).pdf

    深入浅出,主要涵盖了ATL内部架构和实现方法、运用向导简化ATL开发、C++/COM/ATL中字符串的使用技巧、理解并正确实现IUnknown、充分利用ATL提供的Smart Types、撰写能够暴露COM服务器上COM对象的粘合代码、利用...

    后台模板页面

    后台模板页面后台模板页面洞检测(1) jsp无组件(1) jsp动态生成,jsp动态html,静态页面源码(1) java...div+css,做的网站,新手可以参考代码(天雷小组)(1) myqq源代码下载c#myqq(1) c#深入浅出,新手必看完ppt精讲!(1)

    vc++ 应用源码包_6

    vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 ...

    vc++ 应用源码包_5

    vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 ...

    vc++ 开发实例源码包

    2:FTP下载支持多个站点同时下载一个文件(同时支持断点续传). 3:可以在不下载ZIP.RAR.ISO文件的情况下查看文件里面的目录文件. 4:支持多语言. 5:操作综合其它软件. 6:自定义快捷键. 7:在IE工具栏上加按钮,可以直接...

    vc++ 应用源码包_2

    vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 ...

    vc++ 应用源码包_1

    vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 ...

    vc++ 应用源码包_3

    vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 VC++仿Dreamweaver取色器源代码 VC++挂机锁屏系统源程序 VC++建立桌面或开始菜单快捷方式 ...

    VB课程设计俄罗斯方块

    从游戏的基本玩法出发,主要就是俄罗斯方块的形状和旋转,我们在设计中在一个图片框中构造了一个4*4的网状小块,由这些小块组合成新的形状,每四个小块连接在一起就可以构造出一种造型,因此我们总共设计了7中造型,...

Global site tag (gtag.js) - Google Analytics