快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

使用CodeDom开发基于B/S的.NET+MSSQL代码生成器的随感

本人于2005.4月下旬开始编写代码生成器,到今天为止,已经差不多有一个半月左右,目前功能已基本实现,开发过程中,也碰到了很多的困难,在此感谢速马大版主给我的无私帮助,假如这篇文章能够对大家使用CodeDom开发有所帮助的话,我会感到很兴奋,关于CodeDom的介绍大家可以去msdn上看看,在此我就不多说了。
        众所周知,.NET是面向对象的语言,因此一段代码里面就会有类、对象、接口、结构等与面向对象的思想密切相关的要素,而类中会有属性、方式,委托、事件等等,再往下属性又有私有变量或公有变量,这样一层层就象一颗树相同,而这每一个要素都与CodeDom命名空间下的类有着一一对应的关系,当你想用CodeDom生成一个类时,必须先生成类中的要素,如属性、方式,委托、事件等等,生成属性时,也必须先生成属性里的要素,这样一来,每生成一个要素,只要找到CodeDom里对应的类就行了,呵,是不是有点糊涂了。
        不要紧,现在我给大家一个例子看看,可能就要明白些了。
   //保存源代码的流。
   Stream codeStream = File.Open(\"Test.cs\",FileMode.Create);
   StreamWriter codeWriter = new StreamWriter(codeStream);

   //创建一个代码生成器实例
   CSharpCodeProvider provider = new CSharpCodeProvider();
   ICodeGenerator codeGenerator = provider.CreateGenerator(codeWriter);
   CodeGeneratorOptions codeGeneratorOptions = new CodeGeneratorOptions();

   //添加命名空间
   CodeSnippetCompileUnit literal = new CodeSnippetCompileUnit
    (\"using System;/nusing System.Data;/nusing System.Data.SqlClient;/n\");
   codeGenerator.GenerateCodeFromCompileUnit(literal,codeWriter,codeGeneratorOptions);

   //命名空间以及在此命名空间下面创建一个类
   CodeNamespace codeNamespace = new CodeNamespace(\"Codedom\");
   CodeTypeDeclaration codeTypeDeclaration = new CodeTypeDeclaration();
   codeTypeDeclaration.Name = \"TestClass\";
   codeTypeDeclaration.IsClass = true;
   codeTypeDeclaration.TypeAttributes = TypeAttributes.Public;
   codeNamespace.Types.Add(codeTypeDeclaration);

   //创建一个默认的构造函数
   CodeConstructor codeConstructor = new CodeConstructor();
   codeConstructor.Attributes = MemberAttributes.Public;
   codeTypeDeclaration.Members.Add(codeConstructor);

   //创建一个私有的字段
   CodeMemberField codeMember = new CodeMemberField();
   codeMember.Name = \"sTest\";
   codeMember.Attributes = MemberAttributes.Private;
   codeMember.Type = new CodeTypeReference(typeof(string));
   codeTypeDeclaration.Members.Add(codeMember);

   //添加一个可以操作和读取的属性
   CodeMemberProperty codeMemberProperty = new CodeMemberProperty();
   codeMemberProperty.Name = \"Test\";
   codeMemberProperty.Attributes = MemberAttributes.Public;
   codeMemberProperty.Type = new CodeTypeReference(typeof(string));
   codeMemberProperty.GetStatements.Add
    (
    new CodeMethodReturnStatement
    (
    new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),\"sTest\")
    )
    );
   codeMemberProperty.SetStatements.Add
    (
    new CodeAssignStatement
    (
    new CodeFieldReferenceExpression(new CodeThisReferenceExpression(),\"sTest\"),new CodePropertySetValueReferenceExpression()
    )
    );
   codeTypeDeclaration.Members.Add(codeMemberProperty);
   //生成代码
   codeGenerator.GenerateCodeFromNamespace(codeNamespace,codeWriter,codeGeneratorOptions);

   codeWriter.Close();
   codeStream.Close();
运行结果如下:
using System;
using System.Data;
using System.Data.SqlClient;

namespace Codedom{
   
   
    public class TestClass {
       
        private string sTest;
       
        public TestClass() {
        }
       
        public virtual string Test {
            get {
                return this.sTest;
            }
            set {
                this.sTest = value;
            }
        }
    }
}
        以上的代码理解起来并不难,只要大家看一看运行的结果就会明白了,里面详细所用到的类可以在MSDN里查到,今天暂时就写到这里吧,希望能给大家起一个抛砖引玉的作用,呵呵,假如想和我交流的朋友,可以发邮件到我的邮箱:lm517@qq.com,最后告诉大家:把握CodeDom并不难。





返回类别: 教程
上一教程: 用asp.net编写的上传程序
下一教程: 关于日期转变的心得

您可以阅读与"使用CodeDom开发基于B/S的.NET+MSSQL代码生成器的随感"相关的教程:
· 使用CodeDom开发基于B/S的.NET+MSSQL代码生成器的随感
· 基于.Net Framework的N层分布式应用开发
· 基于组件的.NET软件开发(1)
· 使用.NET CF开发Smartphone应用程序 FAQ
· 基于.Net Framework的N层分布式应用开发
    微笑服务 优质保证 索取样品