• 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);

    }

    }

    最后生成的结果是

    image

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

  • 相关阅读:
    React视角下的轮播图
    深入理解JSX
    React.js入门笔记(再续):评论框的实现
    React.js入门笔记(续):用React的方式来思考
    React.js入门笔记
    jquery实现简单瀑布流布局(续):图片懒加载
    jquery实现简单瀑布流布局
    Node.js入门笔记(6):web开发方法
    使用X-UA-Compatible来设置IE浏览器兼容模式
    $(window).load(function() {})和$(document).ready(function(){})的区别
  • 原文地址:https://www.cnblogs.com/Shaina/p/4699157.html
Copyright © 2020-2023  润新知