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é
FullNameest une propriété que nous pouvons qualifier de « calculée », car elle obtenue à partir d’information de la classeUser. -
La propriété
IsAdultest 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 :
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("...");
}
}
}