Maison > Article > développement back-end > Résumer un exemple de code appelé avec des numéros d'expression
En utilisant des arbres d'expression pour créer des délégués afin d'améliorer les performances de réflexion, j'ai apporté quelques petites modifications qui conviennent à mon propre usage
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)); } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!