反射的学习使用 (通过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()
获取方法的参数