最近在使用CodeDom,网上能搜到一些资料和一些博客,MSDN也有介绍,这里不赘述。
    下面是一个例子:

    1. //
    2. //CodeCompileUnit是CodeDom的根
    3. //
    4. CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
    5. //
    6. //using 命名空间
    7. //
    8. CodeNamespace globalNamespace = new CodeNamespace();
    9. globalNamespace.Imports.Add(new CodeNamespaceImport("System"));
    10. globalNamespace.Imports.Add(new CodeNamespaceImport("System.Collections.Generic"));
    11. globalNamespace.Imports.Add(new CodeNamespaceImport("System.ComponentModel"));
    12. globalNamespace.Imports.Add(new CodeNamespaceImport("System.Data"));
    13. globalNamespace.Imports.Add(new CodeNamespaceImport("System.Drawing"));
    14. globalNamespace.Imports.Add(new CodeNamespaceImport("System.Drawing"));
    15. globalNamespace.Imports.Add(new CodeNamespaceImport("System.Linq"));
    16. globalNamespace.Imports.Add(new CodeNamespaceImport("System.Text"));
    17. globalNamespace.Imports.Add(new CodeNamespaceImport("System.Windows.Forms"));
    18. codeCompileUnit.Namespaces.Add(globalNamespace);
    19. //
    20. //命名空间
    21. //
    22. CodeNamespace ns = new CodeNamespace("MyNamespace");
    23. codeCompileUnit.Namespaces.Add(ns);
    24. //
    25. //类
    26. //
    27. CodeTypeDeclaration myClass = new CodeTypeDeclaration("MyClass");
    28. myClass.IsPartial = true;
    29. myClass.Attributes = MemberAttributes.Public;
    30. myClass.TypeAttributes = System.Reflection.TypeAttributes.Public;
    31. myClass.BaseTypes.Add(new CodeTypeReference("Form"));
    32. ns.Types.Add(myClass);
    33. //
    34. //构造函数
    35. //
    36. CodeConstructor con = new CodeConstructor();
    37. con.Comments.Add(new CodeCommentStatement("构造函数"));
    38. con.Attributes = MemberAttributes.Public;
    39. con.Parameters.Add(new CodeParameterDeclarationExpression());
    40. con.Statements.Add(new CodeMethodInvokeExpression(
    41. new CodeMethodReferenceExpression(
    42. new CodeThisReferenceExpression(), "InitializeComponent")));
    43. myClass.Members.Add(con);

    这样的一个CodeDom产生的C#代码如下:

    1. //------------------------------------------------------------------------------
    2. // <auto-generated>
    3. // 此代码由工具生成。
    4. // 运行时版本:2.0.50727.4971
    5. //
    6. // 对此文件的更改可能会导致不正确的行为,并且如果
    7. // 重新生成代码,这些更改将会丢失。
    8. // </auto-generated>
    9. //------------------------------------------------------------------------------
    10. using System;
    11. using System.Collections.Generic;
    12. using System.ComponentModel;
    13. using System.Data;
    14. using System.Drawing;
    15. using System.Linq;
    16. using System.Text;
    17. using System.Windows.Forms;
    18. namespace MyNamespace
    19. {
    20. public partial class MyClass : Form
    21. {
    22. // 构造函数
    23. public MyClass(void )
    24. {
    25. this.InitializeComponent();
    26. }
    27. }
    28. }

    一个值得注意的地方:
    CodeNamespace是new了一个不带参的,然后在其Imports里面添加Namespace,这样产生的代码using在namespace外,否则,using会在namespace中,虽不影响功能,但影响心情。

    CodeDom也能生成一些相对复杂点的语句,例如:
    WinForm的Designer文件中的Dispose方法

    1. CodeCompileUnit codeCompileUnit = new CodeCompileUnit();
    2. //
    3. //命名空间
    4. //
    5. CodeNamespace ns = new CodeNamespace("MyNamespace");
    6. codeCompileUnit.Namespaces.Add(ns);
    7. //
    8. //类
    9. //
    10. CodeTypeDeclaration myDesignerClass = new CodeTypeDeclaration("MyClass");
    11. myDesignerClass.IsPartial = true;
    12. myDesignerClass.Attributes = MemberAttributes.Public;
    13. myDesignerClass.TypeAttributes = System.Reflection.TypeAttributes.Public;
    14. ns.Types.Add(myDesignerClass);
    15. //
    16. //components
    17. //
    18. CodeMemberField components = new CodeMemberField("System.ComponentModel.IContainer", "components");
    19. components.Attributes = MemberAttributes.Private;
    20. components.InitExpression = new CodePrimitiveExpression(null);
    21. myDesignerClass.Members.Add(components);
    22. //
    23. //析构函数
    24. //
    25. CodeMemberMethod DisposeMethod = new CodeMemberMethod();
    26. DisposeMethod.Name = "Dispose";
    27. DisposeMethod.ReturnType = new CodeTypeReference(typeof(void));
    28. DisposeMethod.Attributes = MemberAttributes.Override | MemberAttributes.Family;
    29. DisposeMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(bool), "disposing"));
    30. CodeConditionStatement stmtif = new CodeConditionStatement();
    31. stmtif.Condition = new CodeBinaryOperatorExpression(
    32. new CodeVariableReferenceExpression("disposing"),
    33. CodeBinaryOperatorType.BooleanAnd,
    34. new CodeBinaryOperatorExpression(
    35. new CodeVariableReferenceExpression("disposing"),
    36. CodeBinaryOperatorType.IdentityInequality,
    37. new CodePrimitiveExpression(null)));
    38. CodeExpression dispos = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("components"), "Dispose", new CodeExpression[] { });
    39. stmtif.TrueStatements.Add(dispos);
    40. DisposeMethod.Statements.Add(stmtif);
    41. CodeExpression bdispos = new CodeMethodInvokeExpression(new CodeBaseReferenceExpression(), "Dispose", new CodeExpression[] { new CodeSnippetExpression("disposing")});
    42. DisposeMethod.Statements.Add(bdispos);
    43. myDesignerClass.Members.Add(DisposeMethod);

    产生的代码如下:

    1. //------------------------------------------------------------------------------
    2. // <auto-generated>
    3. // 此代码由工具生成。
    4. // 运行时版本:2.0.50727.4971
    5. //
    6. // 对此文件的更改可能会导致不正确的行为,并且如果
    7. // 重新生成代码,这些更改将会丢失。
    8. // </auto-generated>
    9. //------------------------------------------------------------------------------
    10. namespace MyNamespace
    11. {
    12. public partial class MyClass
    13. {
    14. private System.ComponentModel.IContainer components = null;
    15. protected override void Dispose(bool disposing)
    16. {
    17. if ((disposing
    18. && (disposing != null)))
    19. {
    20. components.Dispose();
    21. }
    22. base.Dispose(disposing);
    23. }
    24. }
    25. }

    好了,先写到这里。后面再补充一些小代码的例子。
    ————————————————
    版权声明:本文为CSDN博主「莱昂纳多达芬奇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/davinciyxw/article/details/7761859