8
votes

Où mettre des fonctions de conversion?

As C # manque de support pour les fonctions autoportantes, j'ai du mal à trouver un endroit pour mettre des fonctions de conversion. Par exemple, je voudrais convertir un énumé en un numéro. En C ++, je ferais la fonction de freestanding suivante pour cela: xxx

Comment puis-je faire ceci avec élégance en C #? Dois-je faire une classe statique mannequin pour tenir la fonction, et si oui, comment puis-je trouver un nom significatif pour cela? Ou devrais-je faire une classe partielle convertie?

Des idées?

Merci d'avance.

Mise à jour : Rétrospect, mon L'exemple n'a pas été très bien choisi, car il existe une conversion par défaut entre Enum et Int. Ce serait un meilleur exemple: xxx


6 commentaires

Myenum e = (myenum) 3; ou myint i = (int) e; sont à la fois des moyens acceptables de convertir entre int et enum dans C #. Cela étant dit, j'ai toujours mis mes fonctions de conversion dans une classe d'utilité.


+1 Classe partielle Convertir est une bonne idée.


Si vous voulez une conversion d'une personne enum sur une personne de classe, alors écrire un opérateur de conversion . Pourquoi désordre avec une méthode quand vous pouvez simplement écrire un opérateur qui fait ce que vous voulez?


@ERIC: Peut-on être fait dans l'affaire Général où la classe de la personne et le SpecialPersonsonumum sont à l'intérieur des bibliothèques tierces?


Malheureusement non. Le code de l'opérateur de conversion doit aller à l'intérieur de la déclaration d'une des choses converties; Dans ce cas, il faudrait que la déclaration de la personne, car vous ne pouvez pas mettre de code à l'intérieur de l'ENUMS. Nous envisageons une fonctionnalité "conversions d'extension" qui vous permettraient de faire ce que vous décrivez; Si vous avez un scénario vraiment génial pour cela, j'aimerais entendre parler de ça.


@ERIC: Quand j'ai posé cette question, je ne m'attendais vraiment pas à ce que des méthodes de vulgarisation fonctionnent également sur des énumérations. Depuis qu'ils le font, je pense que la solution de méthode d'extension est assez bonne. Le seul gain que je puisse penser est la cohérence, ce qui serait gentil mais pas nécessaire.


6 Réponses :


1
votes

Je recommanderais que vous créez et que vous vous assistez, cela contiendrait tous vos Helper Méthodes / Constantes et Enums qui seront utilisés dans d'autres projets.

Cela vous permettra d'inclure facilement cet assemblage avec d'autres assemblages qui en ont besoin et d'éviter des références circulaires.


0 commentaires

9
votes

L'exemple ci-dessus ressemble à un candidat pour une méthode d'extension.
Si cela n'est pas possible, je les définis comme méthodes statiques dans une classe statique; Je les mettais normalement dans une classe statique appelée xxxHelper


2 commentaires

Dans ce cas particulier, une distribution irait bien, dans le cas général, je suis d'accord avec Gishu et j'essaye d'utiliser des méthodes d'extension avant de reproduire une classe "assistant". Gardez la fonctionnalité aussi proche de l'endroit où il appartient (tout en maintenant SRP, bien sûr).


Tu as raison! Je ne m'attendais pas à ce que les méthodes de vulgarisation fonctionnent sur des énumérations, mais apparemment ils le font.



1
votes

Ne pouvez-vous pas utiliser un casting pour cela? (uint32) e . Ou sinon appeler convert.touint32 (e)


1 commentaires

Oui, mais je parle du cas général. Mon exemple était simplement de faire clairement la situation.



1
votes

L'idée de créer une "classe factice" statique semble être ce que Microsoft suggère:

http://msdn.microsoft.com/en-us/library /bb383974.aspx

Je pense que dans votre exemple particulier, faire une classe partielle convertie constitue le plus de sens.


0 commentaires

0
votes

J'ai fait face au problème similaire une fois et j'ai fait ce xxx


1 commentaires

Pour ça ... pourquoi n'utilisez-vous pas la classe.Net System.Convert?



8
votes

J'irais avec: xxx

alors vous utiliseriez simplement myenum.converttoint (); la même chose peut être effectué pour plusieurs conversions de l'intérieur la même classe. Les méthodes d'extension sont en écrus, sacrément sexy.


aussi, 'eric's commentaire À propos de Type Converters m'a googling. Assez génial, mais je ne sais pas comment les utiliser avec un Enum , mais pour d'autres conversions, ils sont propres comme un sifflet à mettre en œuvre. Regardez ici:


0 commentaires