最近在使用CodeDom,网上能搜到一些资料和一些博客,MSDN也有介绍,这里不赘述。
下面是一个例子:
////CodeCompileUnit是CodeDom的根//CodeCompileUnit codeCompileUnit = new CodeCompileUnit();////using 命名空间//CodeNamespace globalNamespace = new CodeNamespace();globalNamespace.Imports.Add(new CodeNamespaceImport("System"));globalNamespace.Imports.Add(new CodeNamespaceImport("System.Collections.Generic"));globalNamespace.Imports.Add(new CodeNamespaceImport("System.ComponentModel"));globalNamespace.Imports.Add(new CodeNamespaceImport("System.Data"));globalNamespace.Imports.Add(new CodeNamespaceImport("System.Drawing"));globalNamespace.Imports.Add(new CodeNamespaceImport("System.Drawing"));globalNamespace.Imports.Add(new CodeNamespaceImport("System.Linq"));globalNamespace.Imports.Add(new CodeNamespaceImport("System.Text"));globalNamespace.Imports.Add(new CodeNamespaceImport("System.Windows.Forms"));codeCompileUnit.Namespaces.Add(globalNamespace);////命名空间//CodeNamespace ns = new CodeNamespace("MyNamespace");codeCompileUnit.Namespaces.Add(ns);////类//CodeTypeDeclaration myClass = new CodeTypeDeclaration("MyClass");myClass.IsPartial = true;myClass.Attributes = MemberAttributes.Public;myClass.TypeAttributes = System.Reflection.TypeAttributes.Public;myClass.BaseTypes.Add(new CodeTypeReference("Form"));ns.Types.Add(myClass);////构造函数//CodeConstructor con = new CodeConstructor();con.Comments.Add(new CodeCommentStatement("构造函数"));con.Attributes = MemberAttributes.Public;con.Parameters.Add(new CodeParameterDeclarationExpression());con.Statements.Add(new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), "InitializeComponent")));myClass.Members.Add(con);
这样的一个CodeDom产生的C#代码如下:
//------------------------------------------------------------------------------// <auto-generated>// 此代码由工具生成。// 运行时版本:2.0.50727.4971//// 对此文件的更改可能会导致不正确的行为,并且如果// 重新生成代码,这些更改将会丢失。// </auto-generated>//------------------------------------------------------------------------------using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace MyNamespace{public partial class MyClass : Form{// 构造函数public MyClass(void ){this.InitializeComponent();}}}
一个值得注意的地方:
CodeNamespace是new了一个不带参的,然后在其Imports里面添加Namespace,这样产生的代码using在namespace外,否则,using会在namespace中,虽不影响功能,但影响心情。
CodeDom也能生成一些相对复杂点的语句,例如:
WinForm的Designer文件中的Dispose方法
CodeCompileUnit codeCompileUnit = new CodeCompileUnit();////命名空间//CodeNamespace ns = new CodeNamespace("MyNamespace");codeCompileUnit.Namespaces.Add(ns);////类//CodeTypeDeclaration myDesignerClass = new CodeTypeDeclaration("MyClass");myDesignerClass.IsPartial = true;myDesignerClass.Attributes = MemberAttributes.Public;myDesignerClass.TypeAttributes = System.Reflection.TypeAttributes.Public;ns.Types.Add(myDesignerClass);////components//CodeMemberField components = new CodeMemberField("System.ComponentModel.IContainer", "components");components.Attributes = MemberAttributes.Private;components.InitExpression = new CodePrimitiveExpression(null);myDesignerClass.Members.Add(components);////析构函数//CodeMemberMethod DisposeMethod = new CodeMemberMethod();DisposeMethod.Name = "Dispose";DisposeMethod.ReturnType = new CodeTypeReference(typeof(void));DisposeMethod.Attributes = MemberAttributes.Override | MemberAttributes.Family;DisposeMethod.Parameters.Add(new CodeParameterDeclarationExpression(typeof(bool), "disposing"));CodeConditionStatement stmtif = new CodeConditionStatement();stmtif.Condition = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("disposing"),CodeBinaryOperatorType.BooleanAnd,new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("disposing"),CodeBinaryOperatorType.IdentityInequality,new CodePrimitiveExpression(null)));CodeExpression dispos = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("components"), "Dispose", new CodeExpression[] { });stmtif.TrueStatements.Add(dispos);DisposeMethod.Statements.Add(stmtif);CodeExpression bdispos = new CodeMethodInvokeExpression(new CodeBaseReferenceExpression(), "Dispose", new CodeExpression[] { new CodeSnippetExpression("disposing")});DisposeMethod.Statements.Add(bdispos);myDesignerClass.Members.Add(DisposeMethod);
产生的代码如下:
//------------------------------------------------------------------------------// <auto-generated>// 此代码由工具生成。// 运行时版本:2.0.50727.4971//// 对此文件的更改可能会导致不正确的行为,并且如果// 重新生成代码,这些更改将会丢失。// </auto-generated>//------------------------------------------------------------------------------namespace MyNamespace{public partial class MyClass{private System.ComponentModel.IContainer components = null;protected override void Dispose(bool disposing){if ((disposing&& (disposing != null))){components.Dispose();}base.Dispose(disposing);}}}
好了,先写到这里。后面再补充一些小代码的例子。
————————————————
版权声明:本文为CSDN博主「莱昂纳多达芬奇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/davinciyxw/article/details/7761859
