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

互联网 17-6-23
照着 利用表达式树构建委托改善反射性能 做了一点小更改正好适合自己用
    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));          }      }

  

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

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: 利用
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:关于Asp.Net Core MongoDB的实例代码

相关资讯