zoukankan      html  css  js  c++  java
  • 如何用C#动态生成代码

    经常被朋友问到如何动态生成代码。这个功能是由.NET Framework内置支持的。下面这个方法就是一个简单的例子

     

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

    //生成代码

    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

  • 相关阅读:
    解决Win10图片打开方式没有“Windows照片查看器”问题
    20199305 2019-2020-2 《网络攻防实践》第四周作业
    20199305 2019-2020-2 《网络攻防实践》第三周作业
    20199305 2019-2020-2 《网络攻防实践》第二周作业
    20199305 2019-2020-2 《网络攻防实践》第一周作业
    20199305 《网络攻防实践》假期作业
    补交作业:第六周 SumN
    外设驱动程序设计-2
    外设驱动程序设计-1
    2019-2020-1 20199305《Linux内核原理与分析》第十二周作业
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1238572.html
Copyright © 2011-2022 走看看