2009-05-15 6 views
131

Possible en double:
Can I add extension methods to an existing static class?méthodes d'extension statique

Est-il possible que je peux ajouter une méthode d'extension statique à une classe.

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

+7

comment cela peut-être un doublon? Cela veut ajouter une méthode d'extension qui se comporte comme une méthode statique (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

ce serait bien si C# supportait la syntaxe comme: "public static DependencyProperty Register (static DependencyProperty x, nom de chaîne, Type propertyType, Type ownerType, FrameworkPropertyMetadata typeMetadata)", afin que je puisse l'utiliser dans Silverlight pour obtenir la compatibilité avec la syntaxe WPF (pour encapsuler la contrainte de valeur de Dr.WPF pour DependencyProperty). Notez le paramètre "DependencyProperty" statique au lieu de celui "this DependencyProperty" (alternativement au lieu de statique peut-être ils pourraient utiliser un autre mot-clé comme type ou typeof) –

+0

Même problème avec 'Enum.Parse' avec fournir une chaîne. L'extension d'une chaîne n'est malheureusement pas aussi évidente que l'extension d'un int. C# manque de syntaxe! – C4u

Répondre

125

En bref, non, vous ne pouvez pas. Réponse longue, les méthodes d'extension sont juste du sucre syntaxique. IE:

si vous avez une méthode d'extension sur la chaîne disons:

public static string SomeStringExtension(this string s) 
{ 
    //whatever.. 
} 

Lorsque vous appelez ensuite:

myString.SomeStringExtension(); 

le compilateur se juste en:

ExtensionClass.SomeStringExtension(myString); 

Comme vous pouvez le voir, il n'y a aucun moyen de faire cela pour les méthodes statiques.

Et une autre chose m'est venue à l'esprit: quel serait vraiment le point de pouvoir ajouter des méthodes statiques sur des classes existantes? Vous pouvez juste avoir votre propre classe d'aide qui fait la même chose, donc ce qui est vraiment le benfit de pouvoir faire:

Bool.Parse(..) 

contre

Helper.ParseBool(..); 

n'apporte pas vraiment grand-chose à la table ...

+136

* Quel serait vraiment le point d'être capable d'ajouter des méthodes statiques sur des classes existantes? * Je voulais le faire à plusieurs reprises dans de nombreux cas. Mon raisonnement est: Je veux étendre 'String.Reconvert' comme une méthode d'extension. Je pourrais écrire 'Helper.ReconvertString', mais en utilisant Visual Studio et auto-complétion, mes collègues ne regarderaient pas sous 'Helper'. Ils chercheraient une méthode 'String', et n'en trouvant pas, vont probablement réinventer la roue. – abelenky

+79

Je ne suis pas du tout d'accord, l'avantage de ce serait le même avantage que les méthodes d'extension instanciées. Je pourrais également utiliser des classes auxiliaires pour servir le même but que les méthodes d'extension normales, mais pourquoi devrais-je quand l'approche d'extension est beaucoup plus élégante à travailler avec. Le sucre syntaxique est utile, qu'il soit instancié ou statique. – WiredWiz

+31

Je pense qu'ils apporteraient tout autant à la table en ce qui concerne le sucre syntaxique. C'est sur l'accessibilité et les choses où vous attendez qu'ils soient dans des classes populaires, plutôt que dans des assistants obscurs. Par exemple, une méthode d'extension comme DateTime.FromNanoseconds serait utile, ou DateTime.FromSecondsSinceEpoch. Ceux-ci n'ont pas de sens en tant que méthode d'instance, puisqu'ils sont essentiellement des constructeurs, mais ils seraient faciles à trouver en tant que méthodes d'extension statiques. La raison en est que les classes de structure sont simplement incomplètes et que les méthodes d'extension sont une solution pour les compléter. – Triynko

-7

Non, mais vous pouvez avoir quelque chose comme:

bool b; 
b = b.YourExtensionMethod(); 
65

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 
} 

Ensuite, vous pouvez l'appeler comme ceci:

int x = 1; 

bool y=x.ToBoolean(); 
+11

+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. D'autant plus que littéralement «analyser» signifie analyser un _string_ :) (voir [définition] (http://en.wikipedia.org/wiki/Parsing)) – tsemer

+1

N'oubliez pas, int est une valeur Type. Vous devez l'utiliser comme @bsneeze 'y = x.ToBoolean()' a écrit, car dans les méthodes d'extension pour les types de valeur, les valeurs sont ** NOT ** en cours de transmission par référence. – LuckyLikey

-2

Vous pouvez 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 celui-ci

 bool bool1 = 0.Parse(); 
     bool bool2 = 1.Parse(); 

     bool? bool3 = 0.Parse2(); 
     bool? bool4 = 1.Parse2(); 
     bool? bool5 = 3.Parse2(); 
+4

Cela ne répond pas à la question. Cela montre uniquement une méthode d'extension normale invoquée sur une instance de 'int', dans ce cas 0, 1, 2 ou 3. Un littéral' int' est autant une instance qu'une variable. – ProfK

+2

Aussi, ne faites pas cela. Déjà. '1.Parse()' n'a pas plus de sens que '" My String "÷ 6'. Votre code doit être clair et compréhensible par les autres. "Parse" consiste à "analyser une chaîne" comme @tsemer mentionné ci-dessus. –