<p>Oui ! (16 ans plus tard)</p>
<p>Depuis <strong>C# 14</strong>, les <em>membres d’extension</em> sont officiellement supportés, y compris les <strong>propriétés d’extension</strong>.</p>
<p>Vous pouvez maintenant écrire des propriétés d’extension en utilisant la nouvelle syntaxe de <strong>bloc extension</strong> :</p>
<p>`using System.Globalization;</p>
<p>public static class DateTimeFormatInfoExtensions<br>
{<br>
extension (DateTimeFormatInfo source)<br>
{<br>
public string ShortDateLongTimeFormat =><br>
source.ShortDatePattern + " " + source.LongTimePattern;<br>
}<br>
}</p>
<pre><code class="lang-auto">
Cette propriété peut être utilisée exactement comme une propriété d'instance normale :
`var format = CultureInfo.InvariantCulture.DateTimeFormat;
var value = format.ShortDateLongTimeFormat;
</code></pre>
<p>Ce qui est inclus</p>
<ul>
<li>
<p><strong>Propriétés</strong> d’extension</p>
</li>
<li>
<p><strong>Méthodes</strong> d’extension</p>
</li>
<li>
<p>Regroupement de membres d’extension sans classes statiques</p>
</li>
<li>
<p>Syntaxe plus propre que les méthodes d’extension classiques</p>
</li>
</ul>
<p>Cette fonctionnalité fait partie de <strong>C# 14</strong>, qui est livré avec <strong>.NET 10 / Visual Studio 2026</strong>.</p>
<p>Documentation officielle :</p>
<p><a href="https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-14#extension-members">https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-14#extension-members</a></p>
<p>Solutions de contournement avant C# 14</p>
<p>Avant C# 14, les propriétés d’extension n’étaient pas supportées par le langage, et plusieurs solutions de contournement existaient :</p>
<ol>
<li>Méthodes d’extension (les plus courantes)<br>
`public static string GetShortDateLongTimeFormat(<br>
this DateTimeFormatInfo source) =><br>
source.ShortDatePattern + " " + source.LongTimePattern;</li>
</ol>
<pre><code class="lang-auto">
Cela fonctionne mais nécessite la syntaxe d'appel de méthode au lieu de l'accès par propriété.
- 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
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)</code></pre>