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()());  }

输出结果:

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

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

   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()());

结果如下:

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

结语

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