C# possède-t-il des propriétés d'extension ?

C# possède-t-il des propriétés d’extension ?


Source : [Stack Overflow](What's new in C# 14 | Microsoft Learn](What's new in C# 14 | Microsoft Learn)

Oui ! (16 ans plus tard)

Depuis C# 14, les membres d’extension sont officiellement supportés, y compris les propriétés d’extension.

Vous pouvez maintenant écrire des propriétés d’extension en utilisant la nouvelle syntaxe de bloc extension :

`using System.Globalization;

public static class DateTimeFormatInfoExtensions
{
extension (DateTimeFormatInfo source)
{
public string ShortDateLongTimeFormat =>
source.ShortDatePattern + " " + source.LongTimePattern;
}
}


Cette propriété peut être utilisée exactement comme une propriété d'instance normale :

`var format = CultureInfo.InvariantCulture.DateTimeFormat;
var value = format.ShortDateLongTimeFormat;

Ce qui est inclus

  • Propriétés d’extension

  • Méthodes d’extension

  • Regroupement de membres d’extension sans classes statiques

  • Syntaxe plus propre que les méthodes d’extension classiques

Cette fonctionnalité fait partie de C# 14, qui est livré avec .NET 10 / Visual Studio 2026.

Documentation officielle :

https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-14#extension-members

Solutions de contournement avant C# 14

Avant C# 14, les propriétés d’extension n’étaient pas supportées par le langage, et plusieurs solutions de contournement existaient :

  1. Méthodes d’extension (les plus courantes)
    `public static string GetShortDateLongTimeFormat(
    this DateTimeFormatInfo source) =>
    source.ShortDatePattern + " " + source.LongTimePattern;

Cela fonctionne mais nécessite la syntaxe d'appel de méthode au lieu de l'accès par propriété.

2. TypeDescriptor / ConditionalWeakTable

Il était possible d'attacher des données dynamiquement à l'exécution en utilisant `TypeDescriptor` ou `ConditionalWeakTable`, mais cette approche :

- Ne s'intègre pas avec le compilateur

- N'est pas un simple sucre syntaxique

- A des performances et un outillage limités

3. Réécriture post-compilation

Des outils comme **PostSharp** ou **Mono.Cecil** peuvent injecter des propriétés après la compilation.

Cependant, cela empêche le compilateur de comprendre l'intention et limite l'optimisation.

Un peu d'histoire

Ext

*(Réponse tronquée)*