- Eles résident dans des classes déclarées comme
static. - Leur première méthode doit être précédée du modificateur
this, suivi du type cible à étendre. - Elles ne peuvent être appelées que sur des instances du type cible. Les classes statiques ne peuvent pas être étendues.
- Les méthodes d'extension ont une priorité inférieure à celle des méthodes d'instance définies dans le type original. Si une méthode d'extension et une méthode d'instance du même type ont la même signature, la méthode d'instance sera toujours préférée.
Supposons que nous ayons une interface IMathOperations et une classe Calculator qui l'implémente, avec des méthodes pour l'addition et la multiplication.
namespace ExistingCode
{
public interface IMathOperations
{
int Sum(int a, int b);
int Product(int a, int b);
}
}
using ExistingCode;
namespace ExistingCode
{
public class Calculator : IMathOperations
{
public int Sum(int a, int b)
{
return a + b;
}
public int Product(int a, int b)
{
return a * b;
}
}
}
Nous souhaitons ajouter une nouvelle opération : le carré de la somme de deux nombres, calculée comme (a + b) * (a + b). Nous pouvons réaliser cela avec une méthode d'extnesion statique.
using ExistingCode;
namespace Extensions
{
public static class MathExtensions
{
/// <summary>
/// Calcule le carré de la somme de deux entiers.
/// </summary>
/// <param name="ops"></param>L'instance du type étendu (IMathOperations).
/// <param name="value1"></param>Le premier opérande.
/// <param name="value2"></param>Le second opérande.
/// <returns>Le résultat du calcul.</returns>
public static int SumSquare(this IMathOperations ops, int value1, int value2)
{
return (value1 + value2) * (value1 + value2);
}
}
}
Dans le point d'entrée de l'application, nous pouvons instancier Calculator et appeler à la fois ses méthodes d'instance et la nouvelle méthode d'extension directement sur l'instance.
using System;
using ExistingCode;
using Extensions; // Assurez-vous que l'espace de noms des extensions est importé
namespace Application
{
internal class Program
{
private static void Main(string[] args)
{
IMathOperations calculatorInstance = new Calculator();
int sumResult = calculatorInstance.Sum(10, 5);
int productResult = calculatorInstance.Product(10, 5);
int sumSquareResult = calculatorInstance.SumSquare(10, 5); // Appel de la méthode d'extension
Console.WriteLine($"Somme : {sumResult}");
Console.WriteLine($"Produit : {productResult}");
Console.WriteLine($"Carré de la somme : {sumSquareResult}");
Console.ReadLine();
}
}
}
Résultat attendu :
Somme : 15
Produit : 50
Carré de la somme : 225