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

作者:网络 来源:佚名 更新时间:2008-07-09 17:16:44 点击:


收集最实用的网页特效代码!

本人于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里查到,今天暂时就写到这里吧,希望能给大家起一个抛砖引玉的作用,呵呵,如果想和我交流的朋友,可以发邮件到我的邮箱:[email protected],最后告诉大家:掌握codedom并不难。