反射的学习使用 (通过Middleware源码学习)

引言  

最近在看.net core源码,其中关于中间件模型的部分反射的源码感觉以后会有用处,这里记录一下:

源码部分

  

//获取方法实例
                var methods = middleware.GetMethods(BindingFlags.Instance | BindingFlags.Public);
                //找到方法名称为Invoke或InvokeAsync的
                var invokeMethods = methods.Where(m =>
                    string.Equals(m.Name, InvokeMethodName, StringComparison.Ordinal)
                    || string.Equals(m.Name, InvokeAsyncMethodName, StringComparison.Ordinal)
                    ).ToArray();

                if (invokeMethods.Length > 1)
                {
                    throw new InvalidOperationException(Resources.FormatException_UseMiddleMutlipleInvokes(InvokeMethodName, InvokeAsyncMethodName));
                }

                if (invokeMethods.Length == 0)
                {
                    throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoInvokeMethod(InvokeMethodName, InvokeAsyncMethodName, middleware));
                }

                var methodInfo = invokeMethods[0];
                //返回结果必须是Task
                if (!typeof(Task).IsAssignableFrom(methodInfo.ReturnType))
                {
                    throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNonTaskReturnType(InvokeMethodName, InvokeAsyncMethodName, nameof(Task)));
                }
                //接收参数必须是HttpContext
                var parameters = methodInfo.GetParameters();
                if (parameters.Length == 0 || parameters[0].ParameterType != typeof(HttpContext))
                {
                    throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoParameters(InvokeMethodName, InvokeAsyncMethodName, nameof(HttpContext)));
                }

解析

  1、middleware.GetMethods(BindingFlags.Instance | BindingFlags.Public)

     GetMethods方法可用通过条件检索该Type所包含的方法函数

  2、typeof(Task).IsAssignableFrom(methodInfo.ReturnType)

  判断方法的返回值是不是Task

  3、methodInfo.GetParameters()

  获取方法的参数

posted @ 2020-05-09 10:22  陌陌秋雨  阅读(243)  评论(0编辑  收藏  举报