攔截器Interceptors是一種可以在編譯時以聲明方式替換原有應用的方法。 這種替換是通過讓Interceptors聲明它攔截的調用的源位置來實現的。 您可以使用攔截器作為源生成器的一部分進行修改,而不是向現有源編譯添加代碼。 演示 使用 .NET 8 創建一個控制台應用程式。併在Propert ...
攔截器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將被攔截,並且不會被執行,而是實際執行攔截器方法,以下是輸出: