反射的妙用:C#通过反射动态生成方法拦截器
2021/11/12 12:40:12
本文主要是介绍反射的妙用:C#通过反射动态生成方法拦截器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
在上一篇文章
反射的妙用:C#通过反射动态生成类型继承接口并实现
我们通过反射动态实现并继承了接口。
这一篇的内容延续上一篇继续扩展:给实现的类添加拦截器。
使用过 MVC 的小伙伴应该都知道 Filter,有请求/异常/返回/认证过滤器,今天我们要实现的拦截器可以理解为 Filter 中的请求过滤器。
实现逻辑:在实现方法主要逻辑之前,调用拦截方法。
第一步:先准备拦截器:
public class Intercept { /// <summary> /// 执行之前 /// </summary> /// <param name="methodName"></param> /// <param name="objs"></param> /// <returns></returns> public object Before(string methodName, object[] objs) { Console.WriteLine($"拦截的方法名:{methodName}"); for (int i = 0; i < objs.Length; i++) { Console.WriteLine("这是参数:" + objs[i]); } return "拦截成功"; } }
第二步:在上一篇动态生成的方法中加入调用拦截器的代码。
// 定义参数集合 var parameters = ilGen.DeclareLocal(typeof(object[])); ilGen.Emit(OpCodes.Ldc_I4, paramType.Length); // 定义新数组 var arr=new object[](); ilGen.Emit(OpCodes.Newarr, typeof(object)); // 将 parameters 推到栈顶 ilGen.Emit(OpCodes.Stloc, parameters); // 填充参数集合数据 for (var j = 0; j < paramType.Length; j++) { ilGen.Emit(OpCodes.Ldloc, parameters); ilGen.Emit(OpCodes.Ldc_I4, j); // 将下一个值的索引加载到堆栈上 ilGen.Emit(OpCodes.Ldarg, j + 1); // 将对应数组索引上的值替换 ilGen.Emit(OpCodes.Stelem_Ref); } ilGen.Emit(OpCodes.Ldarg_0); // 定义参数1 ilGen.Emit(OpCodes.Ldstr, targetMethod.Name); // 定义参数2 ilGen.Emit(OpCodes.Ldloc, parameters); // 调用拦截函数 ilGen.Emit(OpCodes.Callvirt, typeof(Intercept).GetMethod("Before")); // 判断是否需要返回值 if (methodBuilder.ReturnType == typeof(void)) { ilGen.Emit(OpCodes.Pop); } else { // 判断返回类型是否是值类型 if (methodBuilder.ReturnType.IsValueType) { ilGen.Emit(OpCodes.Unbox_Any, methodBuilder.ReturnType); } else { // 强制转换变量为指定类型(返回值 类型) ilGen.Emit(OpCodes.Castclass, methodBuilder.ReturnType); } }
第三步:调用
至此,简单的动态拦截器就实现成功了。
无绪分享
这篇关于反射的妙用:C#通过反射动态生成方法拦截器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具