Heim > Backend-Entwicklung > C#.Net-Tutorial > Fassen Sie den aufgerufenen Beispielcode mit Ausdrucksnummern zusammen

Fassen Sie den aufgerufenen Beispielcode mit Ausdrucksnummern zusammen

零下一度
Freigeben: 2017-06-23 16:17:24
Original
1605 Leute haben es durchsucht

Ich habe Ausdrucksbäume verwendet, um Delegaten zu erstellen, um die Reflexionsleistung zu verbessern, und habe ein paar kleine Änderungen vorgenommen, die für meinen eigenen Gebrauch geeignet sind

    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();
        } 
    }
Nach dem Login kopieren

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));
        }
    }
Nach dem Login kopieren

 

Das obige ist der detaillierte Inhalt vonFassen Sie den aufgerufenen Beispielcode mit Ausdrucksnummern zusammen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage