C#使用Expression.Call动态调用方法

    怎么动态调用方法呢?可以用委托啊,如果方法名称是文本或者写在配置文件里呢?可以用反射来调用,这需要写一堆代码,而且反射效率不是很高。这时就可以使用C#的Expression.Call方法来动态调用,这不是表达式树吗?是的,它也可以动态调用,它的本质上还是委托。Expression.Call是.NET Framework4.0之后出现的特性,可以用来动态调用方法。下面举例说明它的使用。

首先试一下,搞一个方法来动态调用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
public class SampleClass
{
    public int AddIntegers(int arg1, int arg2)
    {
        return arg1 + arg2;
    }
}
public class Program
{
  public static void Main()
  {
   Expression callExpr = Expression.Call(
        Expression.New(typeof(SampleClass)),//类名,新New一个对象
        typeof(SampleClass).GetMethod("AddIntegers", new Type[] { typeof(int), typeof(int) }),  //调用方法
        Expression.Constant(1),//参数1
        Expression.Constant(2)//参数1
        );
       //输出类和方法的名称
    Console.WriteLine(callExpr.ToString());
    //执行方法
    Console.WriteLine(Expression.Lambda<Func<int>>(callExpr).Compile()());
  }

输出结果:

7b131830883c902f8cbe7fbfb53317c4.png

如果是静态方法还可以简写,代码如下:

Expression callExpr = Expression.Call(
                            typeof(SampleClass).GetMethod("AddIntegers"),
                             Expression.Constant(1),
                            Expression.Constant(2)
                        );//AddIntegers是静态方法,可以不用NEW
 //输出结果同上

它还可以直接调用系统方法

Expression callExpr = Expression.Call(
    Expression.Constant("dotnet开发跳槽"), typeof(String).GetMethod("ToUpper", new Type[] { }));
Console.WriteLine(callExpr.ToString());
Console.WriteLine(Expression.Lambda<Func<String>>(callExpr).Compile()());

结果如下:

3edc6b009c11ef358661ce7907a0da89.png

结语

本文讲述了Expression.Call动态调用方法,使用了三个案例来说明它的使用,如果不知道类名可以调用吗?使用反射是可以的。欢迎大家留言讨论。

参考:微软官方文档

版权声明:本文来源于网友收集或网友供稿,仅供学习交流之用,如果有侵权,请转告小编或者留言,本公众号立即删除。

-

技术群:添加小编微信并备注进群

小编微信:mm1552923   

公众号:dotNet编程大全    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值