|
本人于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并不难。
|