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

      获取方法的参数

  • 相关阅读:
    客户端用mstsc不能用一台设备连接终端服务器的解决办法
    [转]知识管理ABC
    Visual Studio常用小技巧[备忘]
    一套外企的数据库设计面试题
    MSDN中的图形元素和文档约定[备忘]
    设计模式概述
    ASP.Net 4.0中新增加的23项功能[转]
    Dreamweaver 8 的相关使用
    浅谈ThreadPool 线程池
    C#委托的异步调用[学习]
  • 原文地址:https://www.cnblogs.com/moshanghuakai/p/12855703.html
Copyright © 2011-2022 走看看