private void GenerateCode() {

/*注意,先导入下面的命名空间

using System.CodeDom

using System.CodeDom.Compiler;

using Microsoft.CSharp;

using System.Reflection;

*/

//准备一个代码编译器单元

CodeCompileUnit unit = new CodeCompileUnit();

//准备必要的命名空间(这个是指要生成的类的空间)

CodeNamespace sampleNamespace=new CodeNamespace("Xizhang.com");

//导入必要的命名空间

sampleNamespace.Imports.Add(new CodeNamespaceImport("System"));

//准备要生成的类的定义

CodeTypeDeclaration Customerclass = new CodeTypeDeclaration("Customer");

//指定这是一个Class

Customerclass.IsClass = true;

Customerclass.TypeAttributes = TypeAttributes.Public | TypeAttributes.Sealed;

//把这个类放在这个命名空间下

sampleNamespace.Types.Add(Customerclass);

//把该命名空间加入到编译器单元的命名空间集合中

unit.Namespaces.Add(sampleNamespace);

//这是输出文件

string outputFile = "Customer.cs";

//添加字段

CodeMemberField field = new CodeMemberField(typeof(System.String), "_Id");

field.Attributes = MemberAttributes.Private;

Customerclass.Members.Add(field);

//添加属性

CodeMemberProperty property = new CodeMemberProperty();

property.Attributes = MemberAttributes.Public | MemberAttributes.Final;

property.Name = "Id";

property.HasGet = true;

property.HasSet = true;

property.Type = new CodeTypeReference(typeof(System.String));

property.Comments.Add(new CodeCommentStatement("这是Id属性"));

property.GetStatements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "_Id")));

property.SetStatements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "_Id"), new CodePropertySetValueReferenceExpression()));

Customerclass.Members.Add(property);

//添加方法(使用CodeMemberMethod)--此处略

//添加构造器(使用CodeConstructor) --此处略

//添加程序入口点(使用CodeEntryPointMethod) --此处略

//添加事件(使用CodeMemberEvent) --此处略

//添加特征(使用 CodeAttributeDeclaration)

Customerclass.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(SerializableAttribute))));

/* 生成枚举、枚举特性Description

//生成特性
            Customerclass.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(DescriptionAttribute)), new CodeAttributeArgument(new CodePrimitiveExpression(listItem.Description))));
            //指定这是一个Enum
            Customerclass.IsEnum = true;
            Customerclass.TypeAttributes = TypeAttributes.Public;
            //添加字段
            CodeMemberField field = new CodeMemberField(typeof(Enum), "枚举项1" + "=" + 1);
            field.Attributes = MemberAttributes.Public;
            //生成特性
            field.CustomAttributes.Add(new CodeAttributeDeclaration(new CodeTypeReference(typeof(DescriptionAttribute)), new CodeAttributeArgument(new CodePrimitiveExpression("枚举描述信息"))));
            Customerclass.Members.Add(field);

**/

//生成代码

CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");

CodeGeneratorOptions options = new CodeGeneratorOptions();

options.BracingStyle = "C";

options.BlankLinesBetweenMembers = true;

using (System.IO.StreamWriter sw = new System.IO.StreamWriter(outputFile)) {

provider.GenerateCodeFromCompileUnit(unit, sw, options);

}

}

最后生成的结果是

注:本文摘自 http://www.cnblogs.com/chenxizhang/archive/2008/07/09/1238572.html  有改动

C# 动态生成类 枚举等的更多相关文章

  1. 【原】如何获取Java动态生成类?

    写作目的:Java大部分框架,如Spring,Hibernate等都会利用动态代理在程序运行的时候生成新的类, 有的时候为了学习,或者深入了解动态代理,想查看动态生成类的源代码究竟长怎么个样子, 通过 ...

  2. Java动态生成类以及动态添加属性

    有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象properties文件. 那么技术实现支持:使用CGLib代理. 具体的实现步骤: 1.配置Maven文件: &l ...

  3. Roslyn 编译器Api妙用:动态生成类并实现接口

    在上一篇文章中有讲到使用反射手写IL代码动态生成类并实现接口. 反射的妙用:C#通过反射动态生成类型继承接口并实现 有位网友推荐使用 Roslyn 去脚本化动态生成,今天这篇文章就主要讲怎么使用 Ro ...

  4. JDK 工具 HSDB 查看动态生成类

    前置工作 1. 复制 JDK 安装目录\jre\bin\sawindbg.dll 到 JDK 安装目录同级的 jre\bin 目录下,否则会报错找不到 sawindbg.dll 文件. 比如我的 sa ...

  5. java ASM动态生成类

    BeanTest2.java import java.io.FileOutputStream; import org.objectweb.asm.AnnotationVisitor; import o ...

  6. java 动态生成类再编译最后代理

    package spring.vhostall.com.proxy; public interface Store { public void sell(); } ------------------ ...

  7. JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架

    1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...

  8. XML之自动生成类,添加,修改,删除类的属性

    1. class ClassHelperDemo { public static void Main() { #region 演示一:动态生成类. //生成一个类t. Type t = ClassHe ...

  9. 如何获取java运行时动态生成的class文件?

    查看运行时生成的文件,以更清楚运行情况. 查看动态生成的类,一般有两个方法: 1. 使用据说是jdk自带包sa-jdi.jar里的工具. 其中,不想自己搞,当然就利用下,sa-jdi.jar 里自带的 ...

随机推荐

  1. JAVA中float与double的区别

    float是单精度类型,精度是8位有效数字,取值范围是10的-38次方到10的38次方,float占用4个字节的存储空间 double是双精度类型,精度是17位有效数字,取值范围是10的-308次方到 ...

  2. TZOJ 4244 Sum(单调栈区间极差)

    描述 Given a sequence, we define the seqence's value equals the difference between the largest element ...

  3. mybatis pagehelper分页插件使用

    使用过mybatis的人都知道,mybatis本身就很小且简单,sql写在xml里,统一管理和优化.缺点当然也有,比如我们使用过程中,要使用到分页,如果用最原始的方式的话,1.查询分页数据,2.获取分 ...

  4. 自定义RPC框架--基于JAVA实现

    视频教程地址 DT课堂(原名颜群) 整体思路RPC(Remote Procedure Call),即远程过程调用.使用RPC,可以像使用本地的程序一样使用远程计算机上的程序.RPC使得开发分布式程序更 ...

  5. js使用锚点回到顶部

    使用锚点链接是一种简单的返回顶部的功能实现.该实现主要在页面顶部放置一个指定名称的锚点链接,然后在页面下方放置一个返回到该锚点的链接,用户点击该链接即可返回到该锚点所在的顶部位置 <body s ...

  6. vc++ openssl 程序签名

    RSA一般有两种应用场景:   1.公钥加密.私钥解密:这是数据安全通信领域最常见情形:   2.私钥加验.公钥验签:这主要用于数字签名. 我们这里用到的是第二种情况: 这里是基于OpenSSL,首先 ...

  7. Chapter3_操作符_算术操作符

    java中的算术操作符与其它语言并无太大区别,常用到的是以下这些: (1)加号(+),减号(-),除号(\),乘号(*),取模操作符(%),其中除号需要特别注意的是,会自动截取掉小数点后面的部分,而不 ...

  8. centos中单进程监控

    [root@k8s6 proc]# ps aux|grep -v PID|sort -rn -k +|head - root ? Ssl : : /usr/bin/dockerd root ? Ssl ...

  9. Itween的代码使用方法 - 01

    BB:Itween是真心不好用! - 透明度动画 void Start () { //键值对儿的形式保存iTween所用到的参数 Hashtable args = new Hashtable(); / ...

  10. Python之旅Day1 数据类型初识(数字|字符串|列表|数据运算) 编码 表达式(if...else|for|while)

    初识PYTHON Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum(吉多·范罗苏姆)于 ...