2012-04-04 3 views
1

opération binaire sont très utile. De cette façon, je peux faire |^& afin d'émettre une nouvelle séquence.Améliorer C# Enum pour utiliser l'opération Bitwise?

Cependant, parfois il y a Enum qui n'a pas de base 2 valeurs attachées (ou valeur du tout).

-à-dire:

enter image description here

Je voudrais Enhance || derive|| attach valeurs au Enum (si posssible) à chaque entrée.

donc je vais pouvoir faire:

if (MyListItemType== Header |Footer) ... 

est-il possible? ou y a-t-il un travail compliqué?

+0

Voulez-vous dire sur une énumération existante qui n'est pas une énumération 'Flags'? – Oded

+0

@oded ouais. 'parfois il y a Enum qui n'a pas de base 2 ...' Je ne vois pas comment les drapeaux peuvent m'aider ici. –

+0

Cela peut sembler bizarre mais peut-être que vous pourriez faire une chaîne de bits comme '001010' et chercher l'Enum et obtenir vos valeurs – V4Vendetta

Répondre

8

Je voudrais améliorer || dériver || attacher des valeurs à l'Enum (si possible) à chaque entrée.

Vous ne pouvez pas faire cela (à moins de redéfinir l'énumération). Mais quand c'est dans le code que vous ne possédez pas, c'est fini. Il peut déjà exister du code qui repose sur la numérotation, changer les valeurs int casserait ce code. Mais cela signifie généralement que l'Enum n'était pas destiné à être un ensemble de bits, donc essayer de l'utiliser comme un n'est probablement pas une bonne idée de toute façon.

C'est une décision de conception pour le créateur du code.

Regardez votre liste d'exemples:

var item = ListItemType.Header | ListItemType.Footer | ListItemType.SelectedItem; 

peut item vraiment être un en-tête, un pied de page et un élément sélectionné en même temps? Ceci est une liste d'options mutuellement exclusives.

5

Vous voulez utiliser un flags ENUM:

[Flags] 
enum Days2 
{ 
    None = 0x0, 
    Sunday = 0x1, 
    Monday = 0x2, 
    Tuesday = 0x4, 
    Wednesday = 0x8, 
    Thursday = 0x10, 
    Friday = 0x20, 
    Saturday = 0x40 
} 
class MyClass 
{ 
    Days2 meetingDays = Days2.Tuesday | Days2.Thursday; 
} 
+3

Je n'ai pas de contrôle sur l'énumération! son intérieur dll –

0
[Flags] 
enum Days2 
{ 
    None = 0x0, 
    Sunday = 0x1, 
    Monday = 0x2, 
    Tuesday = 0x4, 
    Wednesday = 0x8, 
    Thursday = 0x10, 
    Friday = 0x20, 
    Saturday = 0x40 
} 

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

Vous pouvez ensuite utiliser sur eux les opérateurs au niveau du bit.

4

Non, vous ne pouvez pas. Si un Enum n'a pas été marqué avec le FlagsEnumeration et/ou possède les valeurs de masque de bits correctes (comme vous l'avez dit - "n'a pas de base2"), vous ne pouvez pas utiliser des opérations au niveau du bit pour obtenir des résultats significatifs .

+0

L'attribut Flags n'affecte que ToString (et la sérialisation). Ce n'est pas nécessaire et certainement pas suffisant pour activer les opérations sur les bits. –

3

Comme d'autres l'ont dit qu'il ne peut pas être fait, mais je vais utiliser un raccourci à l'aide des méthodes d'extension:

public enum MyEnum 
    { 
     This, 
     That, 
     TheOther 
    } 

    public static class MyEnumeExtensions 
    { 
     public static bool IsAny(this MyEnum enumValue, params MyEnum[] values) 
     { 
      return values.Any((e) => e == enumValue); 
     } 
    } 

Je peux utiliser:

myEnum.IsAny(This, That); 

Ce qui est presque ce que vous vouliez atteindre.

+0

Aliostad merci beaucoup pour vos efforts. –

+0

@RoyiNamir à tout moment mate. J'avais fait quelque chose de similaire dans le passé dans mes projets. – Aliostad

Questions connexes