上一篇文章后面,我做了一个简单的示例,不知道各位有没有印象。哈,没印象也没关系,今天我们来探讨一下如何生成命名空间的代码。
其实,说的就是CodeNamespace类,这个类就是用来生成命名空间定义的代码的。
(1)Imports属性:一个CodeNamespaceImport对象的集合,这个CodeNamespaceImport类与CodeNamespace类有啥不同呢?CodeNamespace类是生成命名空间的定义的代码的;而CodeNamespaceImport表示的是引入的命名空间,即C#里面我们经常用的using System;之类的代码。
(2)Types属性:包含类型定义的集合,大家都知道,一个命名空间里面有N个类,或者枚举、委托之类的玩意儿。
(3)Comments属性:CodeCommentStatement集合,表示注解,其实就是以// 开头的注解行。
看下面的例子就会明白了。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.CodeDom; using System.CodeDom.Compiler; namespace MyApp { class Program { static void Main(string[] args) { CodeNamespace MyNs = new CodeNamespace("TheTest"); CodeCompileUnit myUint = new CodeCompileUnit(); myUint.Namespaces.Add(MyNs); CodeDomProvider provider = CodeDomProvider.CreateProvider("C#"); provider.GenerateCodeFromCompileUnit(myUint, Console.Out, new CodeGeneratorOptions()); Console.ReadKey(); } } }
OK,看看结果。
把上面的代码继续扩展。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.CodeDom; using System.CodeDom.Compiler; namespace MyApp { class Program { static void Main(string[] args) { CodeNamespace MyNs = new CodeNamespace("TheTest"); CodeCompileUnit myUint = new CodeCompileUnit(); // 引入命名空间 MyNs.Imports.Add(new CodeNamespaceImport("System")); MyNs.Imports.Add(new CodeNamespaceImport("System.Data")); MyNs.Imports.Add(new CodeNamespaceImport("System.Drawing")); myUint.Namespaces.Add(MyNs); CodeDomProvider provider = CodeDomProvider.CreateProvider("C#"); provider.GenerateCodeFromCompileUnit(myUint, Console.Out, new CodeGeneratorOptions()); Console.ReadKey(); } } }
看看结果如何。
在上面代码的基础上继续扩展。
// 加入注解 MyNs.Comments.Add(new CodeCommentStatement("这是生成的代码-命名空间")); MyNs.Comments.Add(new CodeCommentStatement("时间:" + DateTime.Now.ToString())); myUint.Namespaces.Add(MyNs); CodeDomProvider provider = CodeDomProvider.CreateProvider("C#"); provider.GenerateCodeFromCompileUnit(myUint, Console.Out, new CodeGeneratorOptions());
结果如下
在上面的代码中,为命名空间定义一个类。
...... // 定义一个类 CodeTypeDeclaration myClass = new CodeTypeDeclaration("Car"); myClass.Attributes = MemberAttributes.Public; myClass.Comments.Add(new CodeCommentStatement("这是一个类")); MyNs.Types.Add(myClass); myUint.Namespaces.Add(MyNs); CodeDomProvider provider = CodeDomProvider.CreateProvider("C#"); provider.GenerateCodeFromCompileUnit(myUint, Console.Out, new CodeGeneratorOptions());
运行结果。
好,本节例子的完整代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.CodeDom; using System.CodeDom.Compiler; namespace MyApp { class Program { static void Main(string[] args) { CodeNamespace MyNs = new CodeNamespace("TheTest"); CodeCompileUnit myUint = new CodeCompileUnit(); // 引入命名空间 MyNs.Imports.Add(new CodeNamespaceImport("System")); MyNs.Imports.Add(new CodeNamespaceImport("System.Data")); MyNs.Imports.Add(new CodeNamespaceImport("System.Drawing")); // 加入注解 MyNs.Comments.Add(new CodeCommentStatement("这是生成的代码-命名空间")); MyNs.Comments.Add(new CodeCommentStatement("时间:" + DateTime.Now.ToString())); // 定义一个类 CodeTypeDeclaration myClass = new CodeTypeDeclaration("Car"); myClass.Attributes = MemberAttributes.Public; myClass.Comments.Add(new CodeCommentStatement("这是一个类")); MyNs.Types.Add(myClass); myUint.Namespaces.Add(MyNs); CodeDomProvider provider = CodeDomProvider.CreateProvider("C#"); provider.GenerateCodeFromCompileUnit(myUint, Console.Out, new CodeGeneratorOptions()); Console.ReadKey(); } } }