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: 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? P> Des idées? P> Merci d'avance. P> Mise à jour B>: 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: p>
6 Réponses :
Je recommanderais que vous créez et que vous vous assistez, cela contiendrait tous vos Helper Méthodes / Constantes et Enums EM> qui seront utilisés dans d'autres projets. P>
Cela vous permettra d'inclure facilement cet assemblage avec d'autres assemblages qui en ont besoin et d'éviter des références circulaires. P>
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 p>
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.
Ne pouvez-vous pas utiliser un casting pour cela? (uint32) e code>. Ou sinon appeler
convert.touint32 (e) code> p>
Oui, mais je parle du cas général. Mon exemple était simplement de faire clairement la situation.
L'idée de créer une "classe factice" statique semble être ce que Microsoft suggère: p>
http://msdn.microsoft.com/en-us/library /bb383974.aspx p>
Je pense que dans votre exemple particulier, faire une classe partielle convertie constitue le plus de sens. P>
J'ai fait face au problème similaire une fois et j'ai fait ce
Pour ça ... pourquoi n'utilisez-vous pas la classe.Net System.Convert?
J'irais avec: alors vous utiliseriez simplement aussi, 'eric's commentaire À propos de Type Converters m'a googling. Assez génial, mais je ne sais pas comment les utiliser avec un myenum.converttoint (); code> 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. P>
Enum code>, mais pour d'autres conversions, ils sont propres comme un sifflet à mettre en œuvre. Regardez ici: p>
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 code> 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 b>. 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.