2011-09-19 8 views
30

मैं 1. को enum ध्वज के सभी बिट्स की स्थापना के लिए एक सामान्य तरीके आश्चर्य स्थापित करने के लिए कैसे मैं सिर्फ एक enum जो सभी तुलना के लिए देता है, अन्य enums की परवाह किए बिना करना चाहते हैं।enum ध्वज के सभी बिट्स

और यह कोड काम करता है;

[Flags] 
public enum SomeRightEnum : uint 
{ 
    CanDoNothing = 0, 
    CanDoSomething = 1 << 0, 
    CanDoSomethingElse = 1 << 1, 
    CanDoYetAnotherThing = 1 << 2, 
    ... 
    DoEverything = 0xFFFFFFFF 
} 

लेकिन इसके बाद के संस्करण के बाद से यह uint हम 'एफ' एस की संख्या निर्धारित है कोड में, यह अगर यह int था काम नहीं होगा।

तो मैं 1 के लिए enum ध्वज के सभी बिट्स स्थापित करने का एक सामान्य तरीके, डेटाप्रकार की परवाह किए बिना सराहना करेंगे (i NT, int64, uint आदि)

+1

हममम। गणनाओं का इरादा परस्पर अनन्य विकल्पों का वर्णन करना है। आप बिटमैस्क के समूह के लिए शॉर्टेंड के रूप में उनका उपयोग कर रहे हैं। –

+1

@AFgone आप enum पर [ध्वज] विशेषता का उपयोग कर रहे हैं? –

+1

@ ओली [ध्वज] एनम पर विशेषता इस उद्देश्य के लिए डिज़ाइन की गई है। –

उत्तर

47

सबसे आसान शायद है:

enum Foo 
{ 
    blah = 1, 
    .... 
    all = ~0 
} 

अहस्ताक्षरित आधारित enum के लिए:

enum Foo : uint 
{ 
    blah = 1, 
    .... 
    all = ~0u; 
} 
+0

बदलना पड़ता है जब मैं इसे आज़माता हूं तो यह कहता है कि "लगातार मूल्य '-1' को 'यूंट' में परिवर्तित नहीं किया जा सकता है" – AFgone

+1

बस डाला गया इसके बाद, उदाहरण के लिए, अनचेक ((uint) ~ 0) ' – leppie

+0

बहुत धन्यवाद यह मैं – AFgone

3
internal static class Program 
{ 
    private static void Main() 
    { 
     Console.WriteLine(Foo.Everything.HasFlag(Foo.None)); // False 
     Console.WriteLine(Foo.Everything.HasFlag(Foo.Baz)); // True 
     Console.WriteLine(Foo.Everything.HasFlag(Foo.Hello)); // True 
    } 
} 

[Flags] 
public enum Foo : uint 
{ 
    None = 1 << 0, 
    Bar = 1 << 1, 
    Baz = 1 << 2, 
    Qux = 1 << 3, 
    Hello = 1 << 4, 
    World = 1 << 5, 
    Everything = Bar | Baz | Qux | Hello | World 
} 

यह है कि क्या आप चाहते थे किया गया था? मैं WPF के लिए एक Bindable enumconverter निर्माण भी ऐसा ही करने की जरूरत :

+0

लेकिन यह अन्य enums के बावजूद नहीं है, जब मैं enums संपादित या हटा देता हूं मुझे इसे "सबकुछ" – AFgone

5

मामले में कोई सोच रहा है।
चूंकि मुझे नहीं पता कि प्रतिबिंब में मूल्यों का क्या अर्थ है, मुझे मैन्युअल रूप से मूल्यों को स्विच करने में सक्षम होना चाहिए (उन्हें चेकबॉक्स पे पर बाध्य करना)
फ़्लैग किए गए एनम के मूल्य को सेट करने के लिए -1 में सेट करने में समस्या है सभी बिट्स
यदि आप इसे -1 पर सेट करते हैं और आप सभी मानों को अनलॉक करते हैं तो इसका परिणाम 0 में नहीं होगा क्योंकि सभी अप्रयुक्त बिट्स unflagged नहीं हैं।
यह मेरी स्थिति के लिए सबसे अच्छा काम किया है।

SomeRightEnum someRightEnum = SomeRightEnum.CanDoNothing; 
Type enumType = someRightEnum.GetType(); 
int newValue = 0; 
var enumValues = Enum.GetValues(enumType).Cast<int>().Where(e => e == 1 || e % 2 == 0); 
foreach (var value in enumValues) 
{ 
    newValue |= value; 
} 
Console.WriteLine(newValue); 

या आप एक विस्तार विधि चाहेगा यदि:

public static class FlagExtensions 
{ 
    public static TEnum AllFlags<TEnum>(this TEnum @enum) 
     where TEnum : struct 
    { 
     Type enumType = typeof(TEnum); 
     long newValue = 0; 
     var enumValues = Enum.GetValues(enumType); 
     foreach (var value in enumValues) 
     { 
      long v = (long)Convert.ChangeType(value, TypeCode.Int64); 
      if(v == 1 || v % 2 == 0) 
      { 
       newValue |= v; 
      } 
     } 
     return (TEnum)Enum.ToObject(enumType , newValue); 
    } 
} 
+0

इसे 'ऑलफ्लैग' नामक एक विस्तार विधि बनाता है जो 'enum' सिस्टम क्लास को बढ़ाता है। तो यह अच्छी तरह से 'enum इस्तेमाल किया जा सकता है।ऑलफ्लैग (टाइपोफ (माईएनम)) 'नहीं? –

+0

@ v.oddou मैंने अपने उत्तर को एक सामान्य विस्तार के साथ अपडेट किया है जो (अपरिवर्तनीय) मान देता है। मैंने गैर-ध्वज मूल्यों को छोड़ने के लिए एक बग भी हटा दिया। – Silvermind

18
[Flags] 
public enum MyEnum 
{ 
    None = 0, 
    First = 1 << 0, 
    Second = 1 << 1, 
    Third = 1 << 2, 
    Fourth = 1 << 3, 
    All = ~(-1 << 4) 
} 
+0

मुझे यह विकल्प पसंद है जो मेरे सामान्य '-1' विकल्प से भी बेहतर है। मैं इस बात का ट्रैक रखने के लिए एक enum का उपयोग कर रहा था कि कार्य पूरा होने पर कौन से कार्यों का अनुरोध किया गया था और ध्वज को हटा दिया गया था। मेरी योजना तब परिणाम का उपयोग निकास कोड के रूप में करने के लिए किया गया था। तो यह कार्यों enum के रखरखाव के साथ मदद करता है। – Schmalls

+1

मैं 'सभी = ~ (~ 0 << 4)' पसंद करता हूं क्योंकि यह थोड़ा और स्पष्ट है। हर कोई नहीं जानता कि '-1' सब' 1 है। –

+0

'कोई नहीं' '-1' नहीं होना चाहिए? – akhansari