设为首页 加入收藏

TOP

C#使用表达式树动态调用方法并实现99乘法表(二)
2019-10-09 19:59:14 】 浏览:185
Tags:使用 表达式 动态 调用 方法 实现 乘法
nc<CommonTest, object[], object>>(reExpression, mParameter, pParameter).Compile()(instance, parameters);//将方法编译成一个Func委托,并执行他

        }

}

以上的代码的调用方式如下:

  CommonTest ct = new CommonTest();

            MethodInfo mi = typeof(CommonTest).GetMethod("TestMethodCall");

            var r = ct.TestExpression(mi, new object[] { 25, "SC" }, ct);

此方法也是C#MVC中调用控制器中的Action的原理代码,其最大的作用是不管目标Action拥有多少个参数,最后调用都只需要一个object[]的参数,避免了直接使用反射调用,但是不确定参数个数的困难。

使用Expression不仅可以实习以上的类似于MVC原理的代码,也可以对表达式树进行解析,可以实现ORM底层的Sql构成,但此出不再进行详解,有兴趣可以百度查询表达式树的解析。

表达式树实现的缺点是功能实现复杂,调试困难,建议在实现之前先将需要实现的功能使用C#语法编写出来,再按照对应的格式通过表达式树来实现,这样相对简单一些。

下面是使用表达式输出一个99乘法表。

以下是实现的结果

 

 

 

首先是通过正常的方式来实现,代码如下:

for (int i = 1; i <= 9; i++)

            {

                for (int j = 1; j <= i; j++)

                {

                    int total = i * j;

                    Console.Write($"{i} * {j} = {total}\t");

                }

                Console.WriteLine();

            }

            Console.ReadKey();

下面是使用表达式树实现相同功能的代码:

/// <summary>

        /// 使用表达式树实现99乘法表

        /// </summary>

        public void TestMultiple()

        {

            LabelTarget labOut = Expression.Label();//用于跳出外部循环的标志

            LabelTarget labIn = Expression.Label();//用于跳出内部循环的标志

 

            ParameterExpression iParameter = Expression.Parameter(typeof(int), "i");//定义外部循环的变量,类似于int i;

            ParameterExpression jParameter = Expression.Parameter(typeof(int), "j");//定义内部循环的变量,类似于int j;

            ParameterExpression rParameter = Expression.Parameter(typeof(int), "result");//定义用于保存i*j的结果的变量

 

            MethodInfo writeString = typeof(Console).GetMethod("Write", BindingFlags.Static | BindingFlags.Public, null, new Type[] { typeof(string) }, null);//

首页 上一页 1 2 3 4 5 下一页 尾页 2/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇向net core 3.0进击——Swagger的.. 下一篇wpf source path

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目