>  기사  >  백엔드 개발  >  표현식 번호로 호출된 예제 코드를 요약합니다.

표현식 번호로 호출된 예제 코드를 요약합니다.

零下一度
零下一度원래의
2017-06-23 16:17:241480검색

표현 트리를 사용하여 리플렉션 성능을 향상시키기 위해 대리자를 구성하고 내 용도에 딱 맞는 몇 가지 작은 변경을 수행했습니다.

    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();
        } 
    }

테스트:

    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));
        }
    }

 

위 내용은 표현식 번호로 호출된 예제 코드를 요약합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.