dotnet 8 et Csharp 12 vont bientôt sortirent, à l’heure où nous écrivons cet article. Nous avons voulu tester les interceptors. Or, l’attribut InterceptsLocation n’est pas disponible. Que faire ?
Prendre une version local du compileur
La première option aurait été de prendre la version actuel de dotnet Roslyn et recompiler en local.
Pas trop la solution pour nous.
Créer un attribut dédié
L’autre solution, c’est de créer un attribut dédié, comme s’il existait déjà dans la version dotnet8 préview actuelle. (nous utilisons la préview : 7).
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
internal sealed class InterceptsLocationAttribute : Attribute
{
public InterceptsLocationAttribute(string filePath, int line, int column)
{
}
}
}
Puis après de créer une méthode d’extension avec l’attribut créé.
public static class GeneratedCode
{
[InterceptsLocation("""D:\Works\Formations\Templates\dotnet\discover-dotnet-next\dotnet8\whatsnew\Csharp12\discoverdotnet8\discoverdotnet8\Program.cs""", 43, 4)]
public static void MyInterceptorMethod(this Example example, string param)
{
Console.WriteLine($"Bouya {param}");
}
}
Le point important ici, c’est surtout de bien préciser la colonne dédié qui correspond au démarrage de la méthode MyInterceptorMethod dans notre Program.cs Le nom et le nombre/types de paramètre doivent être les mêmes que la méthode à remplacer. Résultat : l’interceptor fonctionne avec Csharp 12 !
Ca fonctione : le remplacement à lieu avec l’interceptor de Csharp 12 !
Example ex = new();
ex.MyMethod("test");
ex.MyMethod("test");
ex.MyMethod("test");
public class Example
{
public void MyMethod(string param) => Console.WriteLine(param);
}