Aller au contenu

Les membres d’extension

Présentation

Historiquement, le concept d’« extension » s’appliquait uniquement aux méthodes d’une classe ou d’une interface. La version 14 du langage C# propose une nouvelle syntaxe basée sur le mot clé extension. Pour illustrer cette nouveauté, voici la classe User :

public class User(Guid id, string firstName, string lastName, string email, DateTime birthDate, bool isActive, string role = "User")
{
    public Guid Id { get; init; } = id;
    public string FirstName { get; set; } = firstName;
    public string LastName { get; set; } = lastName;
    public string Email { get; set; } = email;
    public DateTime BirthDate { get; set; } = birthDate;
    public bool IsActive { get; set; } = isActive;
    public string Role { get; set; } = role;
}

Implémentation

Voici un exemple d’implémentation de propriétés d’extension sur la classe User :

public static class UserExtension
{
    extension(User user)
    {
        public string FullName => $"{user.LastName.Trim().ToUpper()} {user.FirstName.Trim()}";

        public bool IsAdult => user.BirthDate <= DateTime.Today.AddYears(-18);
    }
}

Remarquer l’utilisation du mot clé extension qui permet de déclarer une liste de propriétés qui étendent la classe User :

  • La propriété FullName est une propriété que nous pouvons qualifier de « calculée », car elle obtenue à partir d’information de la classe User.

  • La propriété IsAdult est une propriété métier qui implémente une règle métier permettant de déterminer si l’utilisateur est une personne mineure ou majeure.

Utilisation

Commençons par créer un utilisateur :

var user = new User(Guid.NewGuid(), "James", "Ravaille", "james.ravaille@gmail.com", new DateTime(1978, 7, 5), true, "admin");

Puis utilisons les propriétés sur l’instance obtenue :

Console.WriteLine(user.FullName);
Console.WriteLine(user.IsAdult);

Method Extension et Member Extension

Est-il possible d’implémenter une méthode d’extension dans un bloc extension ? La réponse est non. Il faut l’implémenter dans la classe UserExtension. Voici un exemple :

public static class UserExtension
{
    extension(User user)
    {
        public string FullName => $"{user.LastName.Trim().ToUpper()} {user.FirstName.Trim()}";

        public bool IsAdult => user.BirthDate <= DateTime.Today.AddYears(-18);
    }

    public static bool IsValidEmail(this User user)
    {
        return !string.IsNullOrWhiteSpace(user.Email) && user.Email.Contains("...");
    }
}

En revanche dans le bloc extension, il est possible d’ajouter une méthode avec une syntaxe classique. Voici un exemple avec la méthode IsEmailValid() :

public static class UserExtension
{
    extension(User user)
    {
        public string FullName =>
            $"{user.LastName.Trim().ToUpper()} {user.FirstName.Trim()}";

        public bool IsAdult =>
            user.BirthDate <= DateTime.Today.AddYears(-18);

        public bool IsEmailValid()
        {
            return !string.IsNullOrWhiteSpace(user.Email) && user.Email.Contains("...");
        }
    }
}