CodeDom使用笔记(一)

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


好了,先写到这里。后面再补充一些小代码的例子。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值