设为首页 加入收藏

TOP

C#使用表达式树动态调用方法并实现99乘法表(一)
2019-10-09 19:59:14 】 浏览:153
Tags:使用 表达式 动态 调用 方法 实现 乘法

我们在使用C#编程的时候,经常使用反射来动态调用方法,但有时候需要动态的生成方法,下面介绍使用表达式树的方式来自动生成方法,并调用。

首先需要说明什么是表达式,熟悉Linq的程序猿都用过类似于下面的代码:t=>t.Length<=25;

在C#中=>代表这是一个Lambda表达式,它用来对数组进行查询,统计,排序,去重的功能非常有用。而表达式树就是通过动态的创建一个Lambda的方式来实现相关的功能。

下面是一个类似于JS中apply函数的示例。

使用表达式树,一定要引用System.Linq.Expressions;其中的Expression类有很多的方法可以定义一个方法所需要的所有东西。

public class CommonTest

    {

        public object TestMethodCall(int age, string name)

        {

            Console.WriteLine($"{name}'s Age is {age}");

            return true;

        }

        public object TestExpression(MethodInfo method, object[] parameters, CommonTest instance)

        {

            //最终生成的表达式样式(m,p)=>{return (object)m.method(p);}

            //定义两个参数表达式

            ParameterExpression mParameter = Expression.Parameter(typeof(CommonTest), "m");//定义一个名称为m的参数

            ParameterExpression pParameter = Expression.Parameter(typeof(object[]), "p");//定义一个名称为p的参数

 

            ParameterInfo[] tParameter = method.GetParameters();//获取到方法的所有参数

            Expression[] rParameter = new Expression[tParameter.Length];//定义一个与方法参数长度相同的表达式容器,因为在调用方法的时候需要使用的是表达式,不是直接使用方法的参数列表

            for (int i = 0; i < rParameter.Length; i++)

            {

                BinaryExpression pExpression = Expression.ArrayIndex(pParameter, Expression.Constant(i));//从方法中获取到对应索引的参数

                UnaryExpression uExpression = Expression.Convert(pExpression, tParameter[i].ParameterType);//将此参数的类型转化成实际参数的类型

                rParameter[i] = uExpression;//将对应的参数表达式添加到参数表达式容器中

            }

 

            MethodCallExpression mcExpression = Expression.Call(mParameter,method, rParameter);//调用方法,因为是实例方法所以第一个参数必须是m,如果是静态方法,那么第一个参数就应该是null

            UnaryExpression reExpression = Expression.Convert(mcExpression, typeof(object));//将结果转换成object,因为要动态的调用所有的方法,所以返回值必须是object,如果是无返回值的方法,则不需要这一步

            return Expression.Lambda<Fu

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

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目