• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

c# 搞代码 4年前 (2022-01-09) 20次浏览 已收录 0个评论

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

    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, par<p style="color:transparent">本文来源gao!daima.com搞$代!码网</p>amExpressions);            }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));        }    }

  

以上就是总结用表达式数调用的实例代码的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:总结用表达式数调用的实例代码
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址