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;
            }
        }
    }
  • 相关阅读:
    alter noparallel
    朝代
    asp.net core 发布包含文件
    执行dotnet *.dll启动项目,如何修改环境变量----ASPNETCORE_ENVIRONMENT
    MySQL授权--WITH GRANT OPTION
    js/ts/tsx读取excel表格中的日期格式转换
    linux test tool--"ab"
    nginx代理配置
    docker 容器与本机文件的拷贝操作
    linux系统,没有安装任何编辑器的情况,如何操作文件
  • 原文地址:https://www.cnblogs.com/gaocong/p/11532214.html
Copyright © 2011-2022 走看看