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

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

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


 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值