2010-09-16 2 views
3

Possible en double:
Can you make an Extension Method Static/Shared?Comment puis-je étendre la classe, pas l'instance?

Les méthodes d'extension sont super! Pardonnez mon ignorance, mais jusqu'ici j'ai seulement trouvé que vous pouvez étendre une classe pour autoriser des méthodes sur ses instances, mais pas la classe elle-même.

Voici ce que j'essaie de faire.
J'ai un ENUM comme ceci:

enum ViewType 
{ 
    Front_View, 
    Back_View 
} 

Et je l'ai déjà créé une méthode d'extension ToDescription() pour afficher une représentation textuelle conviviale du type d'affichage, comme ceci:

ViewType thisview = ViewType.Front_View; 
string thisviewtext = thisview.ToDescription(); // translates to "Front View" 

Mais plus tard dans le code, je veux analyser de cette traduction dans le type, comme ce code potentiel si je peux supposer étendre le type ENUM lui-même:

// !!!NOT REAL CODE YET!!! 
// translate to value ViewType.FrontView 
ViewType newview = ViewType.ParseFromDescription("Front View"); 

Comment implémenter cette méthode d'extension ParseFromDescription(string) (si possible)?

+0

Pour ce que ça vaut, cela est tout à fait faisable dans des langues comme Ruby. Si vous avez envie de ce genre de contrôle, un langage plus libéral pourrait valoir la peine d'être examiné. –

Répondre

2

Vous ne pouvez pas rendre une méthode statique appelable comme si elle était contenue dans une autre classe statique. Vous ne pouvez pas, par exemple, créer une fonction String.IsNullOrBlank() qui vérifie la chaîne transmise uniquement pour les espaces blancs, en plus d'être nulle ou de longueur nulle. Vous devriez avoir accès au code de classe String et y ajouter la méthode. Pour obtenir le résultat souhaité, je voudrais commencer par la chaîne et implémenter une méthode d'extension ParseDescriptionToViewType() qui prendra la chaîne comme son paramètre "this" et affichera le ViewType.

+0

J'aime votre réponse sur deux comptes. – BeemerGuy

+0

Tout d'abord, la ligne du bas de "vous ne pouvez pas étendre une méthode statique, seulement des méthodes d'instance". – BeemerGuy

+0

Deuxièmement, penser hors de la boîte et étendre l'instance de chaîne pour revenir à l'énumération ViewType. J'aime ça! – BeemerGuy

7

Vous ne pouvez pas faire cela. Vous pouvez définir une classe d'aide statique ViewTypeTools contenant la méthode. Les méthodes d'extension sont fondamentalement la même chose, mais un peu plus agréable à écrire.

+0

Et l'OP a probablement déjà cette classe, puisqu'il a la méthode d'extension .ToDescription() définie quelque part. –

+0

Exactement. Relatif à la question, je suis parfois déçu de la façon dont les fonctionnalités d'une énumération a. Une fois, j'ai résolu un problème similaire en ajoutant des attributs de description à chaque valeur enum, mais il faudrait alors recourir à la réflexion, que j'essaie d'éviter si je le peux. –

0

Une autre option (kludgy) que je n'ai pas testé mais je pense que fonctionnera

((ViewType)null).ParseFromDescription("Front View"); 

// defined like 
public static ViewType(this ViewType me, string description) 
{ 
    // ignore the 'this' parameter, just parse etc ... 
} 
+0

La première ligne n'est-elle pas une exception null-pointeur même lors de la compilation (une demi-blague)? – BeemerGuy

+0

non, parce que le compilateur le changera en 'ViewTypeExtension.ParseFromDescription (null," Front View ");' pour vous. Tant que vous ignorez le premier param dans votre fonction (ou faites des choses valides pour null), tout ira bien. –

Questions connexes