深入浅出.NET代码生成系列(4):定义类型
来源:互联网 发布:金林钣金展开软件2017 编辑:程序博客网 时间:2024/05/23 00:26
CodeTypeDeclaration类可以为我们定义类、结构、接口等。
1、BaseTypes描述要定义类型的基类型。
2、Members当然是定义类型的成员了,如属性、方法、事件等。
3、IsClass、IsEnum、IsInterface、IsStruct这几个就好理解了。
4、TypeAttributes就是对类型的特性描述了,比如public、static等。
5、TypeParameters,类型参数,用于泛型。
问题一:如何定义一个枚举?
首先,我们建一个控制台应用程序,很简单吧,我不多说了,此处省略36个字。
然后呢,代码如下,比较简单,所以我不注释了。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.CodeDom;using System.CodeDom.Compiler;namespace MyApp{ class Program { static void Main(string[] args) { CodeTypeDeclaration enum00 = new CodeTypeDeclaration("Abcdefg"); enum00.IsEnum = true; enum00.Attributes = MemberAttributes.Public; CodeDomProvider provider = CodeDomProvider.CreateProvider("C#"); provider.GenerateCodeFromType(enum00, Console.Out, new CodeGeneratorOptions()); Console.ReadKey(); } }}
执行一下,看看效果。
问题二:如何生成类?
其实是一样的,把IsClass改为true就行了。
CodeTypeDeclaration class001 = new CodeTypeDeclaration("ClassTest"); class001.Attributes = MemberAttributes.Public; class001.IsClass = true; CodeDomProvider provider = CodeDomProvider.CreateProvider("C#"); provider.GenerateCodeFromType(class001,Console.Out, new CodeGeneratorOptions());
生成接口、结构也差不多了,就是一个属性决定。
那么,大家可能有一个疑问,IsClass,IsInterface这些属性,如果我同时设置多个会怎么样呢?试试看。
代码一:
CodeTypeDeclaration class001 = new CodeTypeDeclaration("ClassTest"); class001.Attributes = MemberAttributes.Public; class001.IsClass = true; class001.IsInterface = true;
执行结果如图:
代码二:再加一行。
CodeTypeDeclaration class001 = new CodeTypeDeclaration("ClassTest"); class001.Attributes = MemberAttributes.Public; class001.IsClass = true; class001.IsInterface = true; class001.IsStruct = true;
执行效果如图:
这么看来,它是只认最后一次设置的值了,前面的都被忽略了。
问题三:委托如何定义?
委托是大小姐,身份特殊,所以有特殊待遇,吃饭也吃特供。故不使用CodeTypeDeclaration,而应当使用CodeTypeDelegate类,看看吧,身份再特殊的人都是人,所以,CodeTypeDelegate类其实是从CodeTypeDeclaration派生出来的。
委托这玩意儿我们知道,它其实和定义方法很像的,有返回值(设置ReturnType属性)和参数列表(向Parameters中添加元素)。来,看看下面的例子。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.CodeDom;using System.CodeDom.Compiler;namespace MyApp2{ class Program { static void Main(string[] args) { CodeTypeDelegate myDelegate = new CodeTypeDelegate("TestCallBack"); myDelegate.Attributes = MemberAttributes.Public; myDelegate.Parameters.Add(new CodeParameterDeclarationExpression(typeof(int), "num")); CodeDomProvider provider = CodeDomProvider.CreateProvider("cs"); provider.GenerateCodeFromType(myDelegate, Console.Out, new CodeGeneratorOptions { BracingStyle = "C" }); Console.ReadKey(); } }}
执行一下,看看结果如何。
默认是没有返回值的,咱们再来个有返回值的看看。
static void Main(string[] args) { CodeTypeDelegate myDelegate = new CodeTypeDelegate("TestCallBack"); myDelegate.Attributes = MemberAttributes.Public; myDelegate.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string), "a")); myDelegate.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string),"b")); myDelegate.ReturnType = new CodeTypeReference(typeof(bool)); CodeDomProvider provider = CodeDomProvider.CreateProvider("cs"); provider.GenerateCodeFromType(myDelegate, Console.Out, new CodeGeneratorOptions { BracingStyle = "C" }); Console.ReadKey(); }
看看结果。
问题四:如何为类定义成员?
亲,复习一下基础知识,类的成员有哪些?嗯,字段、属性、方法和事件,四大天王呢,是吧?好,现在开始对号入座,它们都对应着哪些类。
字段——CodeMemberField
属性——CodeMemberProperty
方法——CodeMemberMethod
事件——CodeMemberEvent
好了,入座完毕,开始看电影。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.CodeDom;using System.CodeDom.Compiler;namespace MyApp3{ class Program { static void Main(string[] args) { // 片首曲,定义一个类 CodeTypeDeclaration Myclass = new CodeTypeDeclaration("HelloTest"); // 设置相关参数 Myclass.Attributes = MemberAttributes.Public; Myclass.IsClass = true; // 定义一个字段 CodeMemberField mField = new CodeMemberField(typeof(int), "m_Num"); // 将字段添加到类成员集合中 Myclass.Members.Add(mField); // 定义一个属性 CodeMemberProperty mProperty = new CodeMemberProperty(); mProperty.Name = "Number"; // 属性类型 mProperty.Type = new CodeTypeReference(typeof(int)); // get语句块 mProperty.GetStatements.Add(new CodeMethodReturnStatement( new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), "m_Num") )); // set语句块 mProperty.SetStatements.Add(new CodeAssignStatement( new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), "m_Num"), new CodePropertySetValueReferenceExpression() )); // 将属性添加到类成员中 Myclass.Members.Add(mProperty); // 定义一个方法 CodeMemberMethod mMethod = new CodeMemberMethod(); mMethod.Name = "DoWork"; // 返回类型 mMethod.ReturnType = new CodeTypeReference(typeof(string)); // 公共方法 mMethod.Attributes = MemberAttributes.Public | MemberAttributes.Final; // 方法体 mMethod.Statements.Add(new CodeMethodReturnStatement( new CodePrimitiveExpression("Hello Dog!") )); // 为方法添加注释 mMethod.Comments.Add(new CodeCommentStatement("测试方法")); // 将方法添加到类成员中 Myclass.Members.Add(mMethod); // 片尾曲,生成代码 CodeDomProvider provider = CodeDomProvider.CreateProvider("cs"); provider.GenerateCodeFromType(Myclass, Console.Out, new CodeGeneratorOptions { BracingStyle = "C" }); Console.ReadKey(); } }}
再观看一下效果。
- 深入浅出.NET代码生成系列(4):定义类型
- 深入浅出.NET代码生成系列(1):概述
- 深入浅出.NET代码生成系列(2):一些基本类
- 深入浅出.NET代码生成系列(3):命名空间
- 深入浅出.NET代码生成系列(5):表达式
- 深入浅出.NET代码生成系列(6):语句
- 深入浅出.NET代码生成系列(7):动态生成代码与编译综合示例
- 深入浅出SharePoint—字段类型定义
- ASP.NET深入浅出系列4- 也谈委托和事件
- thrift系列 - thrift类型定义
- 深入浅出DirectShow Filter(一)(学习里面有关媒体类型定义)
- ASP.NET AJAX深入浅出系列课程
- ASP.NET AJAX深入浅出系列课程
- .Net学习难点讨论系列4 – .Net委托类型
- .NET代码生成工具
- 大数据系列-scala类型定义
- Mybatis-Generator自动生成代码——Mybatis 深入浅出(二)
- 类型定义(typedef)
- 消息报头
- mysql 按时间查询
- Java 6对脚本的支持
- 16-7,List
- JAVA的网络编程
- 深入浅出.NET代码生成系列(4):定义类型
- eclipse中跑selenium测试 - [java]
- UPOP数据统计系统中的批量导入数据功能
- Java Double相加出现的怪事
- 210平台调试Ft5406驱动
- 16-8,列表迭代器对象ListIterator it = list.listIterator()
- java 解析 excel数据excel
- Ajax获取数据动态树形节点实现
- 在整个页面都加载完后才执行的操作