zoukankan      html  css  js  c++  java
  • 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  有改动

  • 相关阅读:
    Codeforces 845E Fire in the City 线段树
    Codeforces 542D Superhero's Job dp (看题解)
    Codeforces 797F Mice and Holes dp
    Codeforces 408D Parcels dp (看题解)
    Codeforces 464D World of Darkraft
    Codeforces 215E Periodical Numbers 容斥原理
    Codeforces 285E Positions in Permutations dp + 容斥原理
    Codeforces 875E Delivery Club dp
    Codeforces 888F Connecting Vertices 区间dp (看题解)
    Codeforces 946F Fibonacci String Subsequences dp (看题解)
  • 原文地址:https://www.cnblogs.com/Shaina/p/4699157.html
Copyright © 2011-2022 走看看