Rumah > pembangunan bahagian belakang > Tutorial C#.Net > 总结用表达式数调用的实例代码

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

零下一度
Lepaskan: 2017-06-23 16:17:24
asal
1599 orang telah melayarinya

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

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

        

    }

Salin selepas log masuk

测试:

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

    }

}

Salin selepas log masuk

  

 

Atas ialah kandungan terperinci 总结用表达式数调用的实例代码. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan