• 反射的学习使用 (通过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()

      获取方法的参数

  • 相关阅读:
    背景qwq
    关于Oracle数据库空表无法导出问题
    Linux 备份 Oracle11g 数据库
    Linux Tomcat安装
    Linux JDK安装
    Oracle 监听与服务器
    Xftp强制更新
    Linux 安装 Oracle11g 数据库
    Vue 动态获取组件与动态路由获取组件
    Linux 防火墙
  • 原文地址:https://www.cnblogs.com/moshanghuakai/p/12855703.html
Copyright © 2020-2023  润新知