深入浅出.NET代码生成系列(5):表达式

表达式,这数量说起来就可观了,不过说起来它们都有共同的爹——CodeExpression类。在MSDN在查找CodeExpression类,从继承关系列表中我们就可以看到所有的与代码表达式生成有关的类。

哎哟,妈啊,这么多,你看到这一串家伙,害怕不?哈哈,不要害怕,别看它们“类”多势众,其实并不复杂,而且使用方法也差不多。至于一个个介绍嘛,那显然不现实的,也没有意义,既然MSDN上都有了,那抄下来也没意思,因此,我用N个例子来演示一下它们的用法吧。

例一、创建一个数组

请研究一下下面的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.CodeDom;
using System.CodeDom.Compiler;

namespace CodeExpressionApp
{
    class Program
    {
        static void Main(string[] args)
        {
            CodeArrayCreateExpression arr = new CodeArrayCreateExpression(typeof(string), 5);

            CodeDomProvider provider = CodeDomProvider.CreateProvider("cs");
            provider.GenerateCodeFromExpression(arr, Console.Out, new CodeGeneratorOptions { BracingStyle = "C" });

            Console.ReadKey();
        }
    }
}


这段代码被执行后,输出以下结果。

咦,这好像不太正常啊,是的,我们用CodeArrayCreateExpression类仅仅生成了创建数组的表达式,但并没有定义数组,接下来再把上面的代码改一下,就看起来顺眼多了。

        static void Main(string[] args)
        {
            // 仅仅表示创建数组的表达式
            CodeArrayCreateExpression arr = new CodeArrayCreateExpression(typeof(string), 5);
            // 最好有一个完整的语句
            CodeVariableDeclarationStatement ds =
                new CodeVariableDeclarationStatement(typeof(string[]), "items", arr);

            CodeDomProvider provider = CodeDomProvider.CreateProvider("cs");
            //provider.GenerateCodeFromExpression(arr, Console.Out, new CodeGeneratorOptions { BracingStyle = "C" });
            provider.GenerateCodeFromStatement(ds,
                                               Console.Out,
                                               new CodeGeneratorOptions
                                               {
                                                   BracingStyle = "C"
                                               });

            Console.ReadKey();
        }


看看这回是不是舒服多了。

嘿嘿,如果我希望声明数组后,能够初始化,是不是更好呢。

        static void Main(string[] args)
        {
            CodeArrayCreateExpression MyArr = new CodeArrayCreateExpression(typeof(string),
                            new CodePrimitiveExpression("abcd"),
                            new CodePrimitiveExpression("efghi"),
                            new CodePrimitiveExpression("灰机"),
                            new CodePrimitiveExpression("Money"),
                            new CodePrimitiveExpression("破皮鞋"),
                            new CodePrimitiveExpression("矮冬瓜"));
            CodeVariableDeclarationStatement statement = new CodeVariableDeclarationStatement(
                            typeof(string[]), "items", MyArr);

            CodeDomProvider provider = CodeDomProvider.CreateProvider("C#");
            provider.GenerateCodeFromStatement(statement,
                        Console.Out, new CodeGeneratorOptions { BracingStyle = "C" });

            Console.ReadKey();
        }


这样就声明并初始化了一个数组变量了。

例二、基元数据表达式

CodePrimitiveExpression类可以生成元数据类型的原始表达方式,比如,字符串在代码中是写在一对双引号中的,而十进制制数字是带M后缀的,浮点类型带F后缀等等。这种表达式的意思就是你传什么东西进去,它生成的代码就按照这种类型的本来面目呈现,请看下面的例子。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.CodeDom;
using System.CodeDom.Compiler;

namespace CodeExpressApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            // 十进制娄字
            CodePrimitiveExpression exp = new CodePrimitiveExpression(300000000M);
            // 字符串
            CodePrimitiveExpression exp2 = new CodePrimitiveExpression("King");
            // 浮点型
            CodePrimitiveExpression exp3 = new CodePrimitiveExpression(0.356448f);

            CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
            provider.GenerateCodeFromExpression(
                exp, Console.Out, new CodeGeneratorOptions());
            Console.Out.WriteLine();
            provider.GenerateCodeFromExpression(exp2, Console.Out, new CodeGeneratorOptions());
            Console.Out.WriteLine();
            provider.GenerateCodeFromExpression(exp3, Console.Out, new CodeGeneratorOptions());

            Console.ReadKey();
        }
    }
}

最后我们得出这样的结果。


例三、带二进制运算符的代码表达式

说得简单一点就是带运算符的表达式,如加减乘除,大于,小于等等。

        static void Main(string[] args)
        {
            CodeBinaryOperatorExpression cb = new CodeBinaryOperatorExpression(
                new CodePrimitiveExpression(200),
                CodeBinaryOperatorType.LessThan,
                new CodePrimitiveExpression(600));
            CodeDomProvider provider = CodeDomProvider.CreateProvider("C#");
            provider.GenerateCodeFromExpression(cb, Console.Out, new CodeGeneratorOptions());
            Console.ReadKey();
        }


运行后的结果如下。

例四、this表达式

表示指向当前类实例的表达式,C#中为this,VB中为Me。

        static void Main(string[] args)
        {
            CodeAssignStatement MySm = new CodeAssignStatement(
                new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "ProductName"),
                new CodePrimitiveExpression("山寨手机"));
            Console.Out.WriteLine("--------------------- C#代码 ------------------------\n");
            CodeDomProvider provider = CodeDomProvider.CreateProvider("cs");
            provider.GenerateCodeFromStatement(MySm, Console.Out, new CodeGeneratorOptions());
            Console.Out.WriteLine("\n\n---------------- VB代码 --------------------------\n");
            provider = CodeDomProvider.CreateProvider("vb");
            provider.GenerateCodeFromStatement(MySm, Console.Out, new CodeGeneratorOptions());
            Console.ReadKey();
        }


生成的C#和VB代码如下图所示。

例五、调用方法表达式

使用CodeMethodInvokeExpression 类可以生成调用方法的代码,如:

        static void Main(string[] args)
        {
            CodeMethodInvokeExpression miv = new CodeMethodInvokeExpression(
                new CodeThisReferenceExpression(),
                "ReadDataFromXML",
                new CodePrimitiveExpression("Table"),
                new CodePrimitiveExpression(false),
                new CodePrimitiveExpression(25));
            CodeDomProvider provider = CodeDomProvider.CreateProvider("CS");
            provider.GenerateCodeFromExpression(miv, Console.Out, new CodeGeneratorOptions());
            Console.ReadKey();
        }


运行的效果如图所示。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值