C# 5 : Caller Info Attributes.
Avec C#5, Microsoft n’a pas seulement ajouté le support de l’Asynchronisme avec les mots clés Async/Await…il y avait également les « Caller Info Attributes ».
Pourquoi en parler ?
Parce que dans certains cas, comme nous allons le voir, cela peut être très utile…et que ca n’est pas une feature très connue dans la communauté des développeurs .NET.
Qu’est-ce que c’est ?
Ce sont trois nouveaux Attributs qui se trouvent dans le namespace System.Runtime.CompilerServices utilisable par les paramètres de vos méthodes :
· CallerFilePath : donne le nom du fichier source d’où provient l’appel à votre méthode
· CallerLineNumber : la ligne dans le fichier
· CallerMemberName : le nom de l’ « objet » (Méthode, propriétés, constructeur, lambda,…) qui appelle votre méthode.
A quoi ça peut bien servir ?
Faire des Traces !
public class Foo
{
public void Execute()
{
Trace.WriteError("Error!");
}
}
public static class Trace
{
public static void WriteError(string message,
[CallerFilePath] string callerFilePath = "",
[CallerLineNumber] int callerLineNumber = 0,
[CallerMemberName] string callerMemberName = "")
{
var formattedError = string.Format("{0}/{1}/{2} --> {3}",
callerFilePath, callerLineNumber, callerMemberName, message);
Console.WriteLine(formattedError);
}
}
Nous avons ici une classe Trace avec une methode WriteError qui permet d’écrire sur la console un message formaté contenant les informations issues de nos nouveaux attributs.
Et une autre classe Foo qui contient une méthode Execute qui execute la trace. Comme vous pouvez le voir, nous n’avons besoin de passer uniquement le message d’erreur (les autres paramètres ont des valeurs par défaut mais sont renseignés au runtime).
Notre ami INotifyPropertyChanged !
public class Foo : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; RaisePropertyChanged(); }
}
protected void RaisePropertyChanged([CallerMemberName] string member = "")
{
var propertyChanged = PropertyChanged;
if (propertyChanged != null)
{
propertyChanged(this, new PropertyChangedEventArgs(member));
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void Execute()
{
Trace.Write("Error!");
}
}
On utilise notre attribut MemberCaller pour la méthode RaisePropertyChanged, ainsi, nous n’avons plus à passer un string contenant le nom de la propriété qui a été modifiée !
Il existe bien sûr plusieurs autres cas d’utilisations pour ces attributs (n’hésitez pas à les mettre en commentaire du post si vous en avez) et il est bien dommage de voir qu’ils sont si peu utilisés.
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :