最近在使用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