188 votes

Méthodes d'extension statique

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.

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).

178voto

BFree Points 46421

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...

276 votes

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.

161 votes

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.

56 votes

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.

97voto

bsneeze Points 2382

spécifiquement je veux surcharger Boolean.Parse pour permettre un argument int.

Une extension pour int fonctionnerait-elle ?

public static bool ToBoolean(this int source){
    // do it
    // return it
}

Alors vous pouvez l'appeler comme ceci :

int x = 1;

bool y = x.ToBoolean();

30 votes

+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 )

1 votes

N'oubliez pas que int est un type de valeur. Vous devez l'utiliser comme @bsneeze. y=x.ToBoolean() a écrit, car dans les méthodes d'extension pour les types de valeurs, les valeurs sont PAS étant transmis par référence.

4voto

Ray Points 22127

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.

-2voto

Simon Points 11945

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();

-17voto

BobbyShaftoe Points 19925

Non, mais vous pourriez avoir quelque chose comme :

bool b;
b = b.YourExtensionMethod();

Prograide.com

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.

Powered by:

X