zoukankan      html  css  js  c++  java
  • c# Mono.Cecil IL方式 读MethodBody

    using Kufen.Common.Definitions;
    using Mono.Cecil;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text.RegularExpressions;
    using System.Web;
    
    namespace Kufen.WebApi.SwaggerHelp
    {
        public class SwaggerModelHelp
        {
            public static List<SwaggerEncryptModelInfo> GetDecryptRequestMetaInfoList()
            {
                var decryptRequestMetaInfoList = new List<SwaggerEncryptModelInfo>();
                var path = typeof(SwaggerModelHelp).Assembly.Location;
                var assembly = AssemblyDefinition.ReadAssembly(path);
                var toInspect = assembly.MainModule
                  .GetTypes()
                  .SelectMany(t => t.Methods.Select(m => new { t, m }))
                  .Where(x => x.m.HasBody);
                toInspect = toInspect.Where(
                    x => x.t.Name.EndsWith("Controller") &&
                    x.m.IsPublic == true &&
                    x.m.Parameters.Any(m => m.ParameterType.Name == nameof(DecryptRequest))
                );
                foreach (var method in toInspect)
                {
                    var containsEncryptRequestMethodBody = method.m.Body.Instructions.ToList().Where(m => m.ToString().Contains("EncryptRequestHandler")).FirstOrDefault();
                    if (containsEncryptRequestMethodBody != null)
                    {
                        var ilStr = containsEncryptRequestMethodBody.ToString();
                        var regMatchResult = Regex.Match(ilStr, "EncryptRequestHandler<(?<EncryptRequestModel>[^,]+),(?<EncryptResponseModel>[^>]+)>");
                        var encryptRequestModel = regMatchResult.Groups["EncryptRequestModel"].Value;
                        var encryptResponseModel = regMatchResult.Groups["EncryptResponseModel"].Value;
                        decryptRequestMetaInfoList.Add(new SwaggerEncryptModelInfo
                        {
                            Controller = method.t.FullName,
                            Action = method.m.Name,
                            ReqModelType = encryptRequestModel,
                            ResModelType = encryptResponseModel
                        });
                    }
                }
                return decryptRequestMetaInfoList;
            }
        }
    }
  • 相关阅读:
    TOMCAT添加管理用户认证
    NGINX配置详解及应用
    Zabbix部署
    NGINX+TOMCAT实现反向代理
    数据库-高级部分
    数据库-用户管理与pymysql
    数据库-表操作(CRUD)
    数据库-表关系练习
    数据库-表关系
    数据库-基础概念
  • 原文地址:https://www.cnblogs.com/gaocong/p/11532214.html
Copyright © 2011-2022 走看看