comment puis-je passer sur un enum qui ont l'attribut flags (ou plus précisément est utilisé pour les opérations sur les bits) ?
Je veux être en mesure de frapper tous les cas dans un switch qui correspond à la valeur déclarée.
Le problème est que si j'ai l'enum ci-dessous
[Flags()]public enum CheckType
{
Form = 1,
QueryString = 2,
TempData = 4,
}
et je veux utiliser un commutateur, comme ce
switch(theCheckType)
{
case CheckType.Form:
DoSomething(/*Some type of collection is passed */);
break;
case CheckType.QueryString:
DoSomethingElse(/*Some other type of collection is passed */);
break;
case CheckType.TempData
DoWhatever(/*Some different type of collection is passed */);
break;
}
Si "theCheckType" est définie à la fois CheckType.Forme | CheckType.TempData je le veux pour frapper les deux cas. Évidemment, il l'habitude de frapper les deux dans mon exemple du fait de la rupture, mais d'autres que c'est aussi ne pas parce que CheckType.La forme n'est pas égal à CheckType.Forme | CheckType.TempData
La seule solution que je vois c'est de faire un cas pour toutes les combinaisons possibles des valeurs enum ?
Quelque chose comme
case CheckType.Form | CheckType.TempData:
DoSomething(/*Some type of collection is passed */);
DoWhatever(/*Some different type of collection is passed */);
break;
case CheckType.Form | CheckType.TempData | CheckType.QueryString:
DoSomething(/*Some type of collection is passed */);
DoSomethingElse(/*Some other type of collection is passed */);
break;
... and so on...
Mais cela n'est pas très recherchée (comme il va rapidement grandir très grand)
Droit maintenant, j'ai 3 Si les conditions de droit après l'autre à la place
Quelque chose comme
if ((_CheckType & CheckType.Form) != 0)
{
DoSomething(/*Some type of collection is passed */);
}
if ((_CheckType & CheckType.TempData) != 0)
{
DoWhatever(/*Some type of collection is passed */);
}
....
Mais cela signifie aussi que si j'ai un enum avec 20 valeurs, il faut aller à travers 20 Si les conditions à chaque fois au lieu de "sauter" pour seulement les "cas"/'s que lors de l'utilisation d'un commutateur.
Est-il une solution magique pour résoudre ce problème ?
J'ai pensé à la possibilité d'une boucle sur les valeurs déclarées et ensuite utiliser le commutateur, il ne frappez l'interrupteur pour chaque valeur déclarée, mais je ne sais pas comment il fonctionne et si les performances vice est une bonne idée (par rapport à beaucoup de si) ?
Est-il un moyen facile de parcourir toutes les valeurs enum déclaré ?
Je ne peux que venir avec l'aide ToString() et le fractionnement par "," et puis la boucle à travers la matrice et analyser chaque chaîne unique.
Mise à JOUR:
Je vois que je n'ai pas fait un assez bon travail avec des explications sur. Mon exemple est simple (essayé de simplifier mon scénario).
Je l'utilise pour un ActionMethodSelectorAttribute dans Asp.net MVC afin de déterminer si une méthode doit être disponible lors de la résolution de l'url/route.
Je le fais en déclarant quelque chose comme ceci sur la méthode
[ActionSelectorKeyCondition(CheckType.Form | CheckType.TempData, "SomeKey")]
public ActionResult Index()
{
return View();
}
Cela signifie qu'il doit vérifier si le Formulaire ou TempData avoir une clé comme indiqué pour la méthode à être disponibles.
Les méthodes qu'il va appeler (doSomething(), doSomethingElse() et doWhatever() dans mon exemple précédent) ont en fait un bool comme valeur de retour, et sera appelé avec un paramètre (différentes collections qui ne marche pas à part une interface qui peut être utilisé - voir mon exemple de code dans le lien ci-dessous, etc).
Nous l'espérons vous donnera une meilleure idée de ce que je fais, j'ai collé un exemple simple de ce que je suis en train de faire sur pastebin - il peut être trouvé ici http://pastebin.com/m478cc2b8