上一篇文章后面,我做了一个简单的示例,不知道各位有没有印象。哈,没印象也没关系,今天我们来探讨一下如何生成命名空间的代码。
其实,说的就是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();
}
}
}