• 如何用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

  • 相关阅读:
    jupyter安装出现问题:安装后无法打开
    GitHub上传文件问题总结
    GitHub上传文件夹
    ELK 搭建
    mysql 开放远程连接权限连不上
    mysql linux下安装
    多个springboot项目部署到tomcat,Error deploying web application archive
    mysql 新增时,唯一索引冲突时更新
    日期计算
    mysql 忘记密码
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1238572.html
Copyright © 2020-2023  润新知