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()

      获取方法的参数

  • 相关阅读:
    [译]Vulkan教程(09)窗口表面
    [译]Vulkan教程(08)逻辑设备和队列
    [译]Vulkan教程(07)物理设备和队列家族
    Linux命令行文本工具
    go语言周边
    go第三方常用包
    Centos6安装gcc4.8及以上版本
    pyenv设置python多版本环境
    Redis慢日志
    PHP-CPP开发扩展(七)
  • 原文地址:https://www.cnblogs.com/moshanghuakai/p/12855703.html
Copyright © 2011-2022 走看看