C# 动态生成类 枚举等

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  有改动

时间: 2024-08-27 16:32:16

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

C++实现根据类名动态生成类对象

在开发后台服务的过程中,我们常常需要从数据库中取数据,并将数据缓存在本地中,另外,我们的服务还需要有更新数据的能力:包括定时的主动更新以及数据库数据更新时服务收到通知的被动更新. 之前在需要用到以上功能的时候,模仿着组内通用的数据Cache部分的代码来写,十分方便,基本上只需要自己写两个类:一个是取数据并缓存数据的类XXXData,一个是扇出数据的类XXXFetcher. 在需要使用数据的时候,通过: FetcherFactory::getFetcher<XXXFetcher>() 即可获取一

构建施耐德楼控系统数据库后台服务器示例工程五(JAVA动态生成类)

在做数据库简易工具的过程中遇到了这么一个问题,即程序部署在tomcat下启动运行后,我们无法事先定义数据库中后续创建的表结构的Hibernate Bean对象,这样就需要我们在服务器运行起来后动态创建bean对象.cglib这个开源库即可解决我们的问题,动态创建JAVA对象. 1.cglib开源库简介 CGLIB(Code Generation Library)是一个开源项目,是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口. 反编译后CGLIB结构

Java逆向基础之动态生成类

为什么有这个东西,一方面时AOP框架的需要,另一方面是增加软件逆向的难度 动态生成类的技术目前大体上分为两类,一类是通过操作字节码框架如cglib/Javassist去实现,另一类就是JNI方式,调用dll/so库,内存中动态还原.这两种方式都能实现隐藏类 看一个Javassist动态生成类的例子 package com.vvvtimes; import java.lang.reflect.Modifier; import javassist.ClassPool; import javassis

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

package spring.vhostall.com.proxy; public interface Store { public void sell(); } -------------------------------------------- package spring.vhostall.com.proxy; public class Supermarket implements Store { @Override public void sell() { System.out.pr

JAVA“动态”为类添加属性

部分参考:http://www.cnblogs.com/zy2009/p/6725843.html pom.xml中添加: <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.3</version> </dependency> <dependenc

Silverlight日记:动态生成DataGrid、行列装换、动态加载控件

本文主要针对使用DataGrid动态绑定数据对象,并实现行列转换效果. 一,前台绑定 <sdk:DataGrid x:Name="dataGrid2" Style="{StaticResource ResourceKey=safeDataGrid2}" /> using System; using System.Collections; using System.Collections.Generic; using System.Collections.

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

1. class ClassHelperDemo { public static void Main() { #region 演示一:动态生成类. //生成一个类t. Type t = ClassHelper.BuildType("MyClass"); #endregion #region 演示二:动态添加属性到类. //先定义两个属性. List<ClassHelper.CustPropertyInfo> lcpi = new List<ClassHelper.Cu

讨论一下hibernate如何动态注册一个动态生成的实体类(原)

如何动态生成实体类请参考这篇博文:http://www.cnblogs.com/anai/p/4269858.html 下面说说得到实体类后,如何能使用hibernate的接口来进行数据访问. 我们都知道,hibernate是在web容器启动的时候根据相关配置信息,扫描class文件,然后注册到SessionFactory中.通过getAllClassMetadata()可以得到已经注册过的实体类的元信息.那么如果是在容器启动已经完成后,程序正常运行期间产生的类,显然是不能直接使用hiberna

JDK动态代理,动态生成代理类。

1.动态代理涉及到的类 (1) Java.lang.reflect.Proxy类,作用:动态生成代理类和对象 (2) Java.lang.reflect.InvocationHandler(处理器接口) 可以通过invoke方法实现对真实角色的代理访问,每次通过Proxy生成代理类对象时都要指定处理器对象. package com.xvl.proxy; /** * 接口:明星接口 * @author 1 * */ public interface Star { //面谈 void confer(