本人于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并不难。
新闻热点
疑难解答
图片精选