zoukankan      html  css  js  c++  java
  • 反射的学习使用 (通过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()

      获取方法的参数

  • 相关阅读:
    点击回到顶部
    rem根据屏幕大小适配字体大小
    使用layui-tree美化左侧菜单,点击生成tab选项
    字符串
    mysql ORDER BY field(STATUS, 0,1) 根据字段特定排序问题
    js防止短时间内重复点击
    tp5 where a and (b or c)
    array_diff遇到的坑
    前端开发必配置:html5shiv.js和respond.min.js的作用说明!
    phpmailer QQ邮件发送
  • 原文地址:https://www.cnblogs.com/moshanghuakai/p/12855703.html
Copyright © 2011-2022 走看看