Existe-t-il un moyen d'ajouter une méthode d'extension statique à une classe ?
spécifiquement je veux surcharger Boolean.Parse
pour permettre à un int
argument.
Existe-t-il un moyen d'ajouter une méthode d'extension statique à une classe ?
spécifiquement je veux surcharger Boolean.Parse
pour permettre à un int
argument.
En bref, non, vous ne pouvez pas.
Réponse longue, les méthodes d'extension ne sont que du sucre syntaxique. IE :
Si vous avez une méthode d'extension sur une chaîne de caractères, par exemple :
public static string SomeStringExtension(this string s)
{
//whatever..
}
Quand vous l'appelez ensuite :
myString.SomeStringExtension();
Le compilateur le transforme simplement en :
ExtensionClass.SomeStringExtension(myString);
Comme vous pouvez le constater, il n'y a aucun moyen de le faire pour les méthodes statiques.
Et une autre chose vient de me venir à l'esprit : ce qui serait vraiment le point de pouvoir ajouter des méthodes statiques sur des classes existantes ? Vous pouvez simplement avoir votre propre classe d'aide qui fait la même chose, alors quel est vraiment l'avantage de pouvoir le faire :
Bool.Parse(..)
vs.
Helper.ParseBool(..);
Il n'apporte pas grand chose à la table...
quel serait vraiment l'intérêt de pouvoir ajouter des méthodes statiques sur des classes existantes ? J'ai voulu le faire à plusieurs reprises dans de nombreux cas. Mon raisonnement est le suivant : je veux étendre String.Reconvert
comme méthode d'extension. Je pourrais écrire Helper.ReconvertString
mais en utilisant Visual Studio et l'auto-complétion, mes collègues n'ont pas voulu regarder sous la rubrique Helper
. Ils chercheraient un String
et que vous ne trouvez pas de méthode, vous allez probablement réinventer la roue.
Je ne suis absolument pas d'accord, l'avantage de cette méthode serait le même que celui des méthodes d'extension instanciées. Je pourrais également utiliser des classes d'aide pour servir le même objectif que les méthodes d'extension normales, mais pourquoi le ferais-je alors que l'approche par extension est bien plus élégante à utiliser. Le sucre syntaxique est utile, qu'il soit instancié ou statique.
Je pense qu'ils apporteraient autant à la table que le sucre syntaxique. Il s'agit de l'accessibilité et des choses qui sont là où on s'attend à ce qu'elles soient dans les classes populaires, plutôt que dans des aides obscures. Par exemple, une méthode d'extension comme DateTime.FromNanoseconds serait utile, ou DateTime.FromSecondsSinceEpoch. Ces méthodes n'ont pas de sens en tant que méthodes d'instance, puisqu'elles sont essentiellement des constructeurs, mais elles seraient faciles à trouver en tant que méthodes d'extension statiques. La raison en est que les classes du framework sont simplement incomplètes, et que les méthodes d'extension sont une solution de rechange pour les compléter.
+1 pour la créativité. Vous n'avez pas répondu à sa question mais je crois que vous avez trouvé la solution la plus élégante. Surtout si l'on considère que littéralement "parser" signifie analyser une chaîne de caractères :) (voir définition )
On dirait que tu ne peux pas. Voir ici pour une discussion à ce sujet
Mais j'aimerais bien qu'on me prouve que j'ai tort.
Vous pourriez ajouter une méthode d'extension à int
public static class IntExtensions
{
public static bool Parse(this int value)
{
if (value == 0)
{
return true;
}
else
{
return false;
}
}
public static bool? Parse2(this int value)
{
if (value == 0)
{
return true;
}
if (value == 1)
{
return false;
}
return null;
}
}
utilisé comme ceci
bool bool1 = 0.Parse();
bool bool2 = 1.Parse();
bool? bool3 = 0.Parse2();
bool? bool4 = 1.Parse2();
bool? bool5 = 3.Parse2();
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
On dirait que tu ne peux pas. Voir ici pour une discussion à ce sujet Mais j'aimerais bien qu'on me prouve que j'ai tort.
26 votes
Comment cela peut-il être un doublon ? Cette question veut ajouter une méthode d'extension qui se comporte comme une méthode statique (de classe) à une classe qui peut avoir des instances comme Boolean, alors que l'autre question demande comment ajouter une méthode d'extension à une classe statique.
1 votes
Il serait bien que le C# supporte une syntaxe comme : "public static DependencyProperty Register(static DependencyProperty x, string name, Type propertyType, Type ownerType, FrameworkPropertyMetadata typeMetadata)", afin que je puisse l'utiliser dans Silverlight pour obtenir la compatibilité avec la syntaxe WPF (pour envelopper l'implémentation de Dr.WPF de la coercition de valeur pour DependencyProperty). Notez le paramètre "static DependencyProperty" au lieu de "this DependencyProperty" (alternativement, au lieu de static, on pourrait utiliser un autre mot-clé comme type ou typeof).
0 votes
Même problème avec
Enum.Parse
en fournissant une chaîne de caractères. L'extension d'une chaîne de caractères n'est malheureusement pas aussi évidente que l'extension d'un int. Le C# manque de syntaxe !0 votes
Je pense que cela pourra être réalisé par Shapes dans une prochaine spécification C#.
0 votes
Voici le demande de fonctionnalité . S'il vous plaît upvote il.