拦截器Interceptors是一种可以在编译时以声明方式替换原有应用的方法。

这种替换是通过让Interceptors声明它拦截的调用的源位置来实现的。

您可以使用拦截器作为源生成器的一部分进行修改,而不是向现有源编译添加代码。

演示

使用 .NET 8 创建一个控制台应用程序。并在PropertyGroup中添加以下配置.。需要将其中WebApplication6替换为自己的命名空间。

<InterceptorsPreviewNamespaces>$(InterceptorsPreviewNamespaces);WebApplication6</InterceptorsPreviewNamespaces>

然后在单独的文件中创建InterceptsLocationAttribute。其命名空间必须是System.Runtime.CompilerServices,而不是应用程序的命名空间。

namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public sealed class InterceptsLocationAttribute(string filePath, int line, int character) : Attribute
{
}
}

该属性包含三个参数。

  • filePath是您要拦截的文件的路径。
  • line是您要拦截的代码行。
  • character是您要拦截的代码字符位置。

接着来创建一个具有三种方法的类,模拟新增/查询用户作为示例:

public class GetUserService
{
// This method will not be intercepted;
public void GetUserName()
{
Console.WriteLine("GetUserName");
} // This method will be intercepted;
public void AddUser()
{
Console.WriteLine("AddUser");
} // This method will not be intercepted;
public void DeleteUser()
{
Console.WriteLine("DeleteUser");
}
}

在 Program.cs 文件中,我创建了此类的一个实例,并创建了对这三个方法中每一个的调用。输出如下所示:

var userService = new GetUserService();

userService.GetUserName();
userService.AddUser();
userService.DeleteUser();

现在让我们创建拦截类。该类必须遵循以下规则:

  • 一定是一个static类。
  • 必须是我们要拦截的类的扩展方法。
  • 必须具有该InterceptsLocation属性,其中包含我们要拦截的文件路径的值以及行号和字符号。
using System.Runtime.CompilerServices;

namespace WebApplication6
{
public static class InterceptUserService
{
[InterceptsLocation(
filePath: @"D:\demo\test\ConsoleApp1\WebApplication6\Program.cs",
line: 14,
character: 25)]
public static void InterceptMethodAddUser(this GetUserService example)
{
Console.WriteLine("Interceptor is here!");
}
}
}

在此示例中,将拦截AddUser方法,并且将执行InterceptMethodAddUser方法,而不是执行方法AddUser。

filePath可以按以下方式获取

行号和字符号可以按以下方式获取

现在运行代码,方法AddUser将被拦截,并且不会被执行,而是实际执行拦截器方法,以下是输出:

C# 12 拦截器 Interceptors的更多相关文章

  1. 【Struts2】自定义拦截器interceptors

    下面给一张图片表示Struts2拦截器的处理流程. 通过这个流程图,我们可以看出一个完整的请求大概的过程为: 请求 -->filter 控制器 --> 拦截器 1/ 拦截器 2--> ...

  2. 拦截器interceptors

    拦截器interceptors 1. 基于HandlerMapping,对请求实施拦截,根据业务需求,基于不同的HandlerMapping定义多个拦截器 2. HandlerInterceptor接 ...

  3. java strtus2 拦截器(Interceptors)

    在strtus2 中有一个比较重要的东西就是拦截器(Interceptors) 拦截器可以做到在已有的业务中插入一块共通的,比如在一个业务中,直接插入一串登录功能,就不用去每个页面一个个去显示是否登录 ...

  4. 三种实现日志过滤器的方式 (过滤器 (Filter)、拦截器(Interceptors)和切面(Aspect))

    1.建立RequestWrapper类 import com.g2.order.server.utils.HttpHelper; import java.io.BufferedReader; impo ...

  5. angular中的http拦截器Interceptors

    在angularJs中增加了一个对全局的http请求统一做出处理的api--interceptors Interceptors 有两个处理时机,分别是: 其它程序代码执行 HTTP 请求之后,在实际从 ...

  6. vue中 aixos 常用配置 aixos拦截器 interceptors的使用

                                axios的配置   公共路径配置    拦截器的使用 //这个文件是根组件 new Vue,所有所需的模块和对象都要在new Vue之前配置好 ...

  7. http拦截器interceptors

    在服务里配置$httpProvider.interceptors的相关参数 包含 request请求拦截 response响应拦截 requestError请求错误抛出 responseError响应 ...

  8. 2018.12.17 struts.xml 配置自定义拦截器配置

    自定义拦截器有三个步骤哦 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PU ...

  9. Struts2拦截器初涉

    Struts2拦截器初涉 正在练习struts,本例是从一个pdf上摘抄的例子,那本pdf都不知道叫什么名字,不过感觉很适合初学者. 在这里要实现一个简单的拦截器"GreetingInter ...

  10. java框架之Struts2(4)-拦截器&标签库

    拦截器 概述 Interceptor (拦截器):起到拦截客户端对 Action 请求的作用. Filter:过滤器,过滤客户端向服务器发送的请求. Interceptor:拦截器,拦截的是客户端对 ...

随机推荐

  1. 【Unity3D】异步Socket通讯

    1 前言 ​ 同步 Socket 通讯 中的 Accept.Connect.Receive 等方法会阻塞当前线程,当前线程必须等待这些方法执行完,才会继续往下执行,用户需要另开线程执行这些耗时方法,否 ...

  2. 使用sqlmap执行SQL注入并获取数据库用户名

    Sqlmap介绍 sqlmap支持MySQL, Oracle,PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, ...

  3. SpringBoot+MybatisPlus实现关联表查询

    1.说明 最近写代码用到了mybatisPlus涉及到关联表查询.需求是这样的: 我有一个专业表major其中有个字段是所属院系dept_id,我需要通过这个dept_id关联院系表departmen ...

  4. java使用Timer定时器在指定时间执行程序

    下面是一个利用Timer定时器在每天指定时间执行批处理程序的例子. 有关 java.util.Timer 详细知识请参考API. 值得注意的一点是Timer是单线程顺序执行多个任务的. package ...

  5. 像闪电般击碎天空吧——快速轻量化模型之 SDXL-Lightning

    SDXL-Lightning 是一个由 ByteDance(字节跳动) 开发的文本到图像的生成模型,其主要贡献在于其高速的生成能力和轻量化的设计. 模型的特点 快速生成:SDXL-Lightning ...

  6. go语言range语句中的值的坑

    在range语句中生成的数据的值是真实集合元素的副本,它们不是原有元素的引用.这意味着更新这些值将不会 修改原来的数据,同时也意味着使用这些值的地址将不会得到原有数据的指针. package main ...

  7. Counter函数

    构造一个空Counter import collections c = collections.Counter() c.update('abcdaab') print(c) # Counter({'a ...

  8. [软件工程] CMMI是什么?

    序 能力成熟度模型集成(CMMI) 一.CMMI(能力成熟度模型集成)概述 CMMI是由美国软件工程学会(software engineering institue,简称SEI)制定的一套专门针对软件 ...

  9. Oracle触发器联合唯一约束

    Oracle支持可为空字端的唯一约束呢?下面就是用触发器作出的限制语句,仅供参考: CREATE OR REPLACE TRIGGER Tg_Completion_Test BEFORE INSERT ...

  10. 【Azure API 管理】APIM的容量指标(Capacity)数据异常高的情况记录

    问题描述 APIM从标准版降级到基础版,在没有用户使用的情况,Capacity的指标平均显示在80%以上. 这是什么异常情况呢? 问题分析 APIM的容量指标(Capacity)是 API 管理实例中 ...