Archive

Articles taggués ‘C# 5’

Utiliser la « CIA » lorsqu’on cible une version plus ancienne du Framework

Dans ce billet, nous verrons comment utiliser les attributs d’informations de l’appelant (Caller Info Attributes – CIA ) lorsqu’on cible une version plus ancienne du Framework.

Dans le billet précédent, j’ai parlé des attributs d’informations de l’appelant  comme l’une des nouveautés de C# 5 et disponible sous le Framework 4.5.

À supposer que l’on souhaite cibler une version du Framework plus ancien (Par exemple 4), les attributs d’informations de l’appelant ne sont disponibles que dans la version 4.5, que faire? Y a t-il une astuce qui permettrait l’utilisation des attributs d’informations de l’appelant si l’on cible une version ancienne du Framework? Et bien, oui!

Si on définit nos propres attributs et qu’on les placent dans l’espace de noms où le compilateur s’attend à les trouver, on ferra croire au compilateur que nos attributs sont bien présents.

 

Démo :

  • Ajoutons un nouveau projet dans la solution “CallerInformation"

 

 

  • Affichons les propriétés de notre projet et modifions la cible du Framework (Dans notre cas la version 4)

 

  • Ajoutons notre classe d’attributs :
 
namespace System.Runtime.CompilerServices
{
    class CallerInfoAttributes
    {
        //CallerMemberNameAttribute
        [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
        public sealed class CallerMemberNameAttribute : Attribute
        {
        }

        // CallerFilePathAttribute
        [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
        public sealed class CallerFilePathAttribute : Attribute
        {
        }

        // CallerLineNumberAttribute
        [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
        public sealed class CallerLineNumberAttribute : Attribute
        {
        }
    }
}

 

Après compilation et exécution, l’on s’aperçoit que nos attributs ont été pris en compte par le compilateur.

Cette fonctionnalité peut être utilisée pour cibler les versions 2.0, 3.0, 3.5 et 4 du Framework, bien évidemment sous Visual Studio 2012.

N.B. : Le compilateur vérifie uniquement que les trois types d’attributs existent, peu importe la DLL dans laquelle ils se trouvent.

 

Be connected!

710 total views, no views today

Categories: C# Tags:

C# 5 : Les attributs d’informations de l’appelant (Caller Info attributes)

L’une des nouvelles fonctionnalité de C# 5 sont les attributs d’informations de l’appelant.

Ces attributs sont en fait trois attributs (CallerMemberName, CallerFilePath, CallerLineNumber) des trois classes(CallerMemberNameAttribute, CallerFilePathAttribute,  CallerLineNumberAttribute) que l’on peut utiliser dans les arguments des méthodes, afin d’obtenir plus d’informations sur l’élément appelant. Avec ces trois attributs, l’on peut ainsi récupérer le nom du fichier source qui a appelé, le numéro de ligne dans ce fichier et le nom de l’élément appelant.

Petit résumé :

  • CallerMemberName: Retourne le nom du fichier code source de l’appelant.
  • CallerFilePath: Retourne le numéro de ligne du fichier code de l’appelant.
  • CallerLineNumber: Retourne le nom de l’élément appelant.

Avant d’entre dans le vif du sujet pour une démonstration, il est important de comprendre le fonctionnement des paramètres optionnels.

Paramètres optionnels

Les paramètres optionnels ont vu le jour avec la sortie de C# 4.

Chaque paramètre optionnel est associé à une valeur par défaut dans le cadre de sa définition. Si aucun argument n’est envoyé pour ce paramètre, la valeur par défaut est utilisée.

La bonne utilisation des paramètres optionnels, réduit de façon significative l’usage des surcharges des méthodes.

Exemple de surcharge de méthodes :

 
public void  Display(string nom, int age,string pays)
{
    Console.WriteLine("Nom : " + nom);
    Console.WriteLine("Âge : " + age);
    Console.WriteLine("Pays : " + pays);
}

public void Display(string nom, string prenom, int age, string sexe)
{
    Console.WriteLine("Nom : " + nom);
    Console.WriteLine("Prénom : " + prenom);
    Console.WriteLine("Âge : " + age);
}

Depuis la sortie de C# 4, se serait un gâchis de coder de cette façon. Le code ci-dessus deviendrai :

 
public void Display(string nom, string prenom, string age, string sexe = "Masculin", string pays = "Canada")
{
    Console.WriteLine("============================================================");
    Console.WriteLine("Les attributs optionnels");
    Console.WriteLine("============================================================");
    Console.WriteLine("Nom : " + nom);
    Console.WriteLine("Prénom : " + prenom);
    Console.WriteLine("Âge : " + age);
    Console.WriteLine("Sexe : " + sexe);
    Console.WriteLine("Pays : " + pays);
}

 

Exécutons notre classe :

 
public class Program
{
   static void Main(string[] args)
   {
      new ParametresOptionnels().Display("K", "Nestor Aimé", 15, "Masculin" );
   }
}

 

Résultat :

Dans cet exemple, l’on constate que l’un des paramètres optionnels (pays) a pris la valeur par défaut (“Canada”).

 

Les attributs d’informations de l’appelant (Caller Info Attributes)

Comme mentionné au début de ce billet, avec C# 5, nous pouvons désormais utiliser certains attributs (CallerMemberName, CallerFilePath, CallerLineNumber) pour obtenir de l’information sur l’appelant. Ces trois attributs peuvent s’avérer très efficace lors du développement des solutions de logs et de diagnostiques. Ces attributs sont définis dans l’espace de nom System.Runtime.CompilerServices.

Démo :

 
public class CallerInfoAttributes
{
   public void Display(string nom, string prenom, int age, string sexe = "Masculin", string nationalite = "Canadien",
  [CallerMemberName] string appelant = "",
  [CallerFilePath] string fichier = "",
  [CallerLineNumber] int noLigne = 0)
  {
      Console.WriteLine("============================================================");
      Console.WriteLine("Les attributs d'informations de l'appelant");
      Console.WriteLine("============================================================");
      Console.WriteLine("Bonjour " + prenom + " " + nom + ", vous avez " + age + " ans " + " et êtes de nationalité " + nationalite);
      Console.WriteLine("Cette méthode est appelée dans la méthode: " + appelant + ", du fichier " + fichier + ", à la ligne " + noLigne);
  }
}

static void Main(string[] args)
{
   new ParametresOptionnels().Display("K", "Nestor Aimé", 15, "Masculin");
   new CallerInfoAttributes().Display("K", "Nestor Aimé", 15, "Masculin");
}

 

Résultat :

 

N’est ce pas merveilleux!

Quelques détails de la démo:

CallerMemberName : permet de récupérer le nom du membre ayant appelé la méthode Display. Ici l’« élément » est une méthode (Dans certains cas l’élément peut -être une propriété, un constructeur ou encore un destructeur).

CallerFilePath : permet de récupérer le nom du fichier code source d’où provient l’appel (Main).

CallerLineNumber : permet de récupérer la ligne du fichier code source d’où provient l’appel (14).

Bon à savoir : L’attribut CallerMemberName  implémente l’interface INotifyPropertyChanged.

 

Be connected!

1,468 total views, no views today

Categories: C# Tags: ,