2010-10-13 6 views
5

मैं एक विस्तार विधि बनाना चाहता हूं कि यह गणना करने के लिए कि कोई गणना ध्वज है या नहीं।सी # विस्तार विधि यह जांचने के लिए कि क्या एक गणना में ध्वज सेट है

DaysOfWeek workDays = DaysOfWeek.Monday | DaysOfWeek.Tuesday | DaysOfWeek.Wednesday; 
// instead of this: 
if ((workDays & DaysOfWeek.Monday) == DaysOfWeek.Monday) 
    ... 

// I want this: 
if (workDays.ContainsFlag(DaysOfWeek.Monday)) 
    ... 

मैं इसे कैसे पूरा कर सकता हूं? (यदि वहाँ एक वर्ग कि पहले से ही करता है यह तो मैं यह कैसे कोडित किया जा सकता है के लिए एक स्पष्टीकरण की सराहना करेंगे है, मैं चारों ओर इस विधि के साथ खिलवाड़ किया गया है लंबे समय तक भी) पहले से

धन्यवाद

+0

[सी # में Enum विस्तार] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/1647634/extending-enum-in-c) –

+0

वास्तव में मदद की करती है, के लिए धन्यवाद। – Marlon

उत्तर

10

नेट 4 में पहले से ही इस funcitonality शामिल है, यदि संभव हो, तो उन्नयन।

days.HasFlag(DaysOfWeek.Monday); 

यदि यह उन्नत करने के लिए संभव नहीं है, यहाँ कहा विधि के क्रियान्वयन है:

public bool HasFlag(Enum flag) 
{ 
    if (!this.GetType().IsEquivalentTo(flag.GetType())) { 
     throw new ArgumentException(Environment.GetResourceString("Argument_EnumTypeDoesNotMatch", flag.GetType(), this.GetType())); 
    } 

    ulong uFlag = ToUInt64(flag.GetValue()); 
    ulong uThis = ToUInt64(GetValue()); 
    return ((uThis & uFlag) == uFlag); 
} 

आप आसानी से बराबर विस्तार विधि बना सकते हैं:

public static bool HasFlag(this Enum @this, Enum flag) 
{ 
    // as above, but with '@this' substituted for 'this' 
} 
+0

दुर्भाग्यवश अपग्रेड करने में असमर्थ रहा हूं। त्वरित उत्तर के लिए धन्यवाद – Marlon

0

मैं हाल ही में इस में भाग मुसीबत।

यदि आपको नहीं पता कि एनम का प्रकार क्या है, तो आप एंट को एक इंट में डाल सकते हैं और एनम फ़ील्ड नाम को मूल्य में पार्स करने के लिए एनम स्थिर विधियों का उपयोग कर सकते हैं और op_Bitwise का उपयोग कर सकते हैं और मानों की तुलना करने के लिए।

यदि आप रुचि रखते हैं तो मैं इसे बाद में कोड के साथ अपडेट कर दूंगा, लेकिन अब दरवाजा खोल रहा हूं।

संबंधित मुद्दे