Maison >développement back-end >Tutoriel C#.Net >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"); 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(); } }</parameterexpression></parameterexpression>
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!