Maison >développement back-end >Tutoriel C#.Net >Résumer un exemple de code appelé avec des numéros d'expression

Résumer un exemple de code appelé avec des numéros d'expression

零下一度
零下一度original
2017-06-23 16:17:241549parcourir

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn