总结用表达式数调用的实例代码


本文摘自PHP中文网,作者零下一度,侵删。

照着 利用表达式树构建委托改善反射性能 做了一点小更改正好适合自己用

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public static class DynamicMethodBuilder

{public static Delegate BuildDynamicDelegate(MethodInfo methodInfo, ConstructorInfo constructorInfo = null)

    {if (methodInfo == null)throw new ArgumentNullException("methodInfo");

        List<ParameterExpression> paramExpressions = methodInfo.GetParameters().Select((p, i) =>{var name = "param" + (i + 1);return Expression.Parameter(p.ParameterType, name);

        }).ToList();

        MethodCallExpression callExpression;if (methodInfo.IsStatic)

        {//Call(params....)callExpression = Expression.Call(methodInfo, paramExpressions);

        }else{if (constructorInfo != null)

            {//Instance(params).Call(params....)List<ParameterExpression> constructorParamExpressions = constructorInfo.GetParameters().Select((p, i) =>{var name = "constparam" + (i + 1);return Expression.Parameter(p.ParameterType, name);

                }).ToList();

                callExpression = Expression.Call(Expression.New(constructorInfo, constructorParamExpressions), methodInfo, paramExpressions);

                paramExpressions.InsertRange(0, constructorParamExpressions);

            }else{

                callExpression = Expression.Call(Expression.New(methodInfo.ReflectedType), methodInfo, paramExpressions);

            }

        }return Expression.Lambda(callExpression, paramExpressions).Compile();

    }

}

测试:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

public class Baby

{

    private readonly DateTime _birthDay;

    public Baby(DateTime birthDay)

    {

        _birthDay = birthDay;

    }

    public Baby()

    {

        _birthDay = DateTime.Now;

    }

 

    public string GetBabyInfo(string name, int sex) => $"姓名:{name} , 出生天数:{ DateTime.Now- _birthDay} ,性别 :{(sex == 1 ? "" : "")}";

 

}

 

class Program

{

    static void Main(string[] args)

    {

        Type targetType = Assembly.GetExecutingAssembly().GetType("ConsoleApplication1.Baby");

 

        MethodInfo methodInfo = targetType.GetMethod("GetBabyInfo", new[] { typeof(string), typeof(int) });

        ConstructorInfo constructor = targetType.GetConstructor(new[] { typeof(DateTime) });

 

        WithConstructor(methodInfo, constructor);

        WithOutConstructor(methodInfo);

        Console.ReadKey();

    }

    static void WithConstructor(MethodInfo methodInfo, ConstructorInfo constructor)

    {

        var func = (Func<DateTime, string, int, string>)DynamicMethodBuilder.BuildDynamicDelegate(methodInfo, constructor);

        Console.WriteLine(func(DateTime.Now.AddDays(-100), "糖墩儿", 1));

    }

    static void WithOutConstructor(MethodInfo methodInfo)

    {

        var func = (Func<string, int, string>)DynamicMethodBuilder.BuildDynamicDelegate(methodInfo);

        Console.WriteLine(func("糖墩儿", 1));

    }

}

  

以上就是总结用表达式数调用的实例代码的详细内容!

相关阅读 >>

return后面的值不能为表达式吗?

c#中关于扩展方法的实例分析

克隆对象的方法实例教程

调用user32.dll显示其他窗口

c# 利用委托进行异步处理实例代码

使用一个wpf程序起调一个uwp程序

c#如何使用正则表达式来验证中文字符的案例

memorycache问题修复的解决方法

正则表达式模式匹配字符串基础知识_正则表达式

lambda表达式进行对象结合操作的实例详解

更多相关阅读请进入《表达式》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...