Pouvez-vous ajouter des extensions statiques aux classes en C #? Non mais vous pouvez le faire:
public static class Extensions
{
public static T Create<T>(this T @this)
where T : class, new()
{
return Utility<T>.Create();
}
}
public static class Utility<T>
where T : class, new()
{
static Utility()
{
Create = Expression.Lambda<Func<T>>(Expression.New(typeof(T).GetConstructor(Type.EmptyTypes))).Compile();
}
public static Func<T> Create { get; private set; }
}
Voici comment ça fonctionne. Bien que vous ne puissiez techniquement pas écrire de méthodes d'extension statiques, ce code exploite plutôt une faille dans les méthodes d'extension. Cette lacune étant que vous pouvez appeler des méthodes d'extension sur des objets null sans obtenir l'exception null (sauf si vous accédez à quoi que ce soit via @this).
Alors, voici comment vous utiliseriez ceci:
var ds1 = (null as DataSet).Create(); // as oppose to DataSet.Create()
// or
DataSet ds2 = null;
ds2 = ds2.Create();
// using some of the techniques above you could have this:
(null as Console).WriteBlueLine(...); // as oppose to Console.WriteBlueLine(...)
Maintenant, POURQUOI ai-je choisi d'appeler le constructeur par défaut à titre d'exemple, et pourquoi ne retourne-je pas simplement T () dans le premier extrait de code sans faire toutes ces ordures d'expression? Eh bien aujourd'hui, votre jour de chance car vous obtenez un 2fer. Comme tout développeur .NET avancé le sait, le nouveau T () est lent car il génère un appel à System.Activator qui utilise la réflexion pour obtenir le constructeur par défaut avant de l'appeler. Merde, Microsoft! Cependant, mon code appelle directement le constructeur par défaut de l'objet.
Les extensions statiques seraient mieux que cela, mais les temps désespérés appellent des mesures désespérées.