總結用運算式數調用的執行個體代碼

來源:互聯網
上載者:User
照著 利用運算式樹狀架構構建委託改善反射效能 做了一點小更改正好適合自己用

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

測試:

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

  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.