现在的位置: 首页 > 综合 > 正文

深入浅出.NET代码生成系列(3):命名空间

2012年12月05日 ⁄ 综合 ⁄ 共 3289字 ⁄ 字号 评论关闭
文章目录

上一篇文章后面,我做了一个简单的示例,不知道各位有没有印象。哈,没印象也没关系,今天我们来探讨一下如何生成命名空间的代码。

其实,说的就是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();
        }
    }
}

 

抱歉!评论已关闭.