Parfois, lors de la lecture du code C # des autres, je vois une méthode qui acceptera plusieurs valeurs d'énumération dans un seul paramètre. J'ai toujours pensé que c'était plutôt chouette, mais je ne l'ai jamais regardé.
Eh bien, maintenant je pense que j'en ai peut-être besoin, mais je ne sais pas comment
- configurer la signature de méthode pour accepter cela
- travailler avec les valeurs de la méthode
- définir l'énumération
pour réaliser ce genre de chose.
Dans ma situation particulière, j'aimerais utiliser le System.DayOfWeek, qui est défini comme:
[Serializable]
[ComVisible(true)]
public enum DayOfWeek
{
Sunday = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6
}
Je souhaite pouvoir transmettre une ou plusieurs des valeurs DayOfWeek à ma méthode. Est-ce que je pourrai utiliser cette énumération particulière telle quelle? Comment faire les 3 choses ci-dessus?
Réponses:
Lorsque vous définissez l'énumération, attribuez-la simplement avec [Flags], définissez les valeurs sur des puissances de deux, et cela fonctionnera de cette façon.
Rien d'autre ne change, à part le passage de plusieurs valeurs dans une fonction.
Par exemple:
Pour plus de détails, consultez la documentation de MSDN sur les types d'énumération .
Modifier en réponse aux ajouts à la question.
Vous ne pourrez pas utiliser cette énumération telle quelle, à moins que vous ne vouliez faire quelque chose comme la passer en tant que tableau array / collection / params. Cela vous permettrait de transmettre plusieurs valeurs. La syntaxe des indicateurs nécessite que Enum soit spécifié comme indicateurs (ou pour bâtarder le langage d'une manière qui n'est pas conçue).
la source
Je pense que la solution la plus élégante est d'utiliser HasFlag ():
la source
DaysOfWeek days = new DaysOfWeek(); if (cbTuesday.Checked) days |= DaysOfWeek.Tuesday; if (cbWednesday.Checked) days |= DaysOfWeek.Wednesday;
...Je seconde la réponse de Reed. Cependant, lors de la création de l'énumération, vous devez spécifier les valeurs de chaque membre d'énumération pour créer une sorte de champ de bits. Par exemple:
la source
Vous ne pouvez pas utiliser le System.DayOfWeek comme une
[Flags]
énumération car vous n'avez aucun contrôle dessus. Si vous souhaitez avoir une méthode qui accepte plusieurs,DayOfWeek
vous devrez utiliser leparams
mot - cléSinon, vous pouvez créer votre propre
[Flags]
énumération comme indiqué par de nombreux autres répondeurs et utiliser des comparaisons au niveau du bit.la source
Vous devez spécifier les nombres et les incrémenter comme ceci car il stocke les valeurs de manière bit à bit.
Ensuite, définissez simplement votre méthode pour prendre cette énumération
et pour l'appeler faites quelque chose comme
Pour vérifier si l'une des valeurs d'énumération a été incluse, vérifiez-les à l'aide d'opérations au niveau du bit comme
la source
appeler la méthode dans ce format
MethodName (DaysOfWeek.Tuesday | DaysOfWeek.Thursday);
Implémentez une méthode EnumToArray pour obtenir les options passées
la source
Marquez votre énumération avec l'attribut [Flags]. Assurez-vous également que toutes vos valeurs sont mutuellement exclusives (deux valeurs ne peuvent pas s'additionner) comme 1,2,4,8,16,32,64 dans votre cas
Lorsque vous avez une méthode qui accepte une énumération DayOfWeek, utilisez l'opérateur binaire ou (|) pour utiliser plusieurs membres ensemble. Par exemple:
Pour vérifier si le paramètre contient un membre spécifique, utilisez l' opérateur binaire and (&) avec le membre que vous recherchez.
la source
Reed Copsey a raison et j'ajouterais au message d'origine si je le pouvais, mais je ne peux pas donc je devrai répondre à la place.
Il est dangereux d'utiliser simplement [Flags] sur n'importe quelle ancienne énumération. Je pense que vous devez modifier explicitement les valeurs d'énumération en puissances de deux lorsque vous utilisez des indicateurs, pour éviter les conflits dans les valeurs. Consultez les instructions pour FlagsAttribute et Enum .
la source
Avec l'aide des réponses affichées et celles-ci:
J'ai l'impression de bien le comprendre.
Merci.
la source
Quelque chose de cette nature devrait montrer ce que vous recherchez:
la source