2012-12-13 24 views
7

पर विचार करें मैं इस विस्तार विधि है:जांच एक enum में किसी भी झंडे है अगर आम

public static bool HasAnyFlagInCommon(this System.Enum type, Enum value) 
{ 
    var flags = value.ToString().Split(new string[] { ", " }, 
            StringSplitOptions.None); 
    foreach (var flag in flags) 
    { 
     if (type.ToString() == flag) 
      return true; 
    } 
    return false; 
} 

और निम्न स्थिति:

[Flags] 
enum Bla 
{ 
    A = 0, 
    B = 1, 
    C = 2, 
    D = 4 
} 

Bla foo = Bla.A | Bla.B; 
Bla bar = Bla.A; 

bar.HasAnyFlagInCommon(foo); //returns true 

मैं अगर foo के साथ आम में किसी भी झंडे है जाँच करना चाहते हैं बार, लेकिन विस्तार विधि में इस व्यवहार को प्राप्त करने का एक बेहतर तरीका होना चाहिए। (संभावना के लिए खाते

public static bool HasAnyFlagInCommon(this System.Enum type, Enum value) 
    { 
     var flags = Enum.GetValues(value.GetType()).Cast<Enum>() 
           .Where(item => value.HasFlag(item)); 
     foreach (var flag in flags) 
     { 
      if (type == flag) 
       return true; 
     } 
     return false; 
    } 

उत्तर

2

कुछ

तरह
public static bool HasAnyFlagInCommon(this System.Enum type, Enum value) 
{ 
    return (((long)type) & ((long)value)) != 0; 
} 

& किसी भी बिट है कि दोनों enums में सेट किया गया है के लिए 1 देता है, तो अगर कोई ऐसे बिट्स हैं परिणाम गैर-शून्य है।

(मुझे आशा है कि जो कुछ भी प्रकार enum underlies के लिए काम करेंगे में long का उपयोग किया है;। int अपने मामले में नहीं करना चाहिए)

+0

धन्यवाद, बहुत अच्छा! – Erpel

6

आप बस एक Ulong को Enum मूल्य डाल सकता कि अंतर्निहित प्रकार के डिफ़ॉल्ट नहीं है:

मैं भी इस तरह की कोशिश की है, लेकिन हमेशा सच रिटर्न है int)। यदि परिणाम! = 0, कम से कम एक ध्वज सेट किया गया था।

ulong theValue = (ulong)value; 
return (theValue != 0); 

याद रखें, दिन के अंत में, enum बाइट, sbyte, लघु, ushort, पूर्णांक, uint, लंबे, या Ulong में से एक के द्वारा समर्थित है।

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

एक ध्वज स्थापित किया जा रहा के रूप में एक इसी बिट समर्थन प्रकार में से चालू होने में ही है। उलंग उपरोक्त केवल 0 होगा यदि सभी बिट बंद हो जाते हैं।

+0

मुझे लगता है कि तुम गलत विचार आया, मैं चीजों को स्पष्ट करने के लिए मेरे सवाल संपादित अप। अभी भी अंतर्निहित संख्या का उपयोग एक समाधान हो सकता है। – Erpel

+0

इसके अलावा, भले ही यह "किसी भी परिभाषित झंडे सेट" हों, फिर भी अगर कोई बिट सेट किया गया था तो सही परिणाम वापस नहीं किया जाएगा जो परिभाषित झंडे में से एक नहीं था। – Rawling