Home >Backend Development >C#.Net Tutorial >Summarize example code called with expression numbers

Summarize example code called with expression numbers

零下一度
零下一度Original
2017-06-23 16:17:241550browse

Following the example of using expression trees to build delegates to improve reflection performance, I made a few small changes that are just right for my own use

    public static class DynamicMethodBuilder
    {public static Delegate BuildDynamicDelegate(MethodInfo methodInfo, ConstructorInfo constructorInfo = null)
        {if (methodInfo == null)throw new ArgumentNullException("methodInfo");
            List6ed9e344592e3da2922eb9d5bbc10ed5 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....)List6ed9e344592e3da2922eb9d5bbc10ed5 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();
        } 
    }

Test:

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

 

The above is the detailed content of Summarize example code called with expression numbers. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn