C# : obtenir les informations sur l’appelant d’une méthode

C#

C#
Obtenir des informations sur l’appelant d’une méthode est très utile dans les scénarios de binding de propriété et de fonction de log. Traditionnelement, les procédés suivants seraient mis en oeuvre :

pour identifier la méthode appelante :

Pour simplement identifier la méthode appelante, on peut toujours examiner la StackTrace, dans laquelle les objets StackFrame (namespace System.Diagnostics) fournissent les méthodes GetMethod et GetFileName.

pour transmettre le nom d’une propriété :

Par exemple dans le cas du binding, on utilise l’instruction nameof() qui permet de conserver le lien de compilation entre le nom de la propriété et sa valeur. Dans tous les cas on n’utilise pas de chaînes de caractères car si on renomme la propriété alors le binding est cassé car la chaîne n’est plus à jour.

exemple :

string _MyProp;
public string MyProp {
    set {
        _MyProp = value;
        NotifyPropertyChanged(nameof(MyProp));
    }
}

Hors depuis C# 4.5, on peut faire beaucoup mieu avec les attributs de paramètres de méthodes fournis par le namespace System.Runtime.CompilerSerices :

  • CallerFilePathAttribute : chemin du fichier de l’appelant
  • CallerLineNumberAttribute : numéro de ligne de l’appelant
  • CallerMemberNameAttribute : nom de membre de l’appelant (nom de méthode ou nom de propriété)

La méthode NotifiyPropertyChanged peut alors être appellée sans obligatoirement fournir le nom de paramètre :

string _MyProp;
public string MyProp {
    set {
        _MyProp = value;
        NotifyPropertyChanged();    /* plus de paramètre ! */
    }
}

protected void NotifyPropertyChanged( [CallerMemberName] string propName = "")    /* propName est initialisé avec CallerMemberName si il n'est pas défini */
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
}

Fonction de log:

Une fonction de log pourra recevoir de la même manière les précieuses informations sur l’appelant :

public void Log(
    string text,
    [System.Runtime.CompilerServices.CallerMemberNameAttribute] string member = "",
    [System.Runtime.CompilerServices.CallerFilePathAttribute] string filePath = "",
    [System.Runtime.CompilerServices.CallerLineNumberAttribute] int lineNumber = 0) 
{
    System.Diagnostics.WriteLine($"{text} | {member} | {filePath}:{lineNumber}");
}

La librairie C# NAccLogger utilise ces principes pour fournir un grand niveau de détails dans les logs. Vous pouvez lire plus à propos de cette librairie dans cet article.

Laisser un commentaire