2009-10-30 15 views
5

मैं सोच रहा था या नहीं, मैंसी # में Enum विस्तार

मैं लागू करने के लिए कोशिश कर रहा हूँ अपने कस्टम Enum.GetValues ​​(प्रकार) को लागू करने और इसे पसंद Enum.GetMyCustomValues ​​(प्रकार) कॉल करने के लिए सी # में Enum प्रकार विस्तार कर सकते हैं कुछ इस तरह:

public static bool IsFlagSet<T>(this T value, T flag) where T : Enum 
{ 
    return (value & flag) != (T)0; 
} 

लेकिन ऐसा नहीं किया जा सकता है ... किसी भी काम arounds मैं कर सकता है? चीयर्स

+0

http://stackoverflow.com/questions/1415140/c-enums-can-my-enums-have-friendly-names –

+0

हो सकता है कि यह क्या है? http://msdn.microsoft.com/en-us/library/bb383974.aspx – Asher

उत्तर

4

एक्सटेंशन स्थिर तरीकों के निर्माण के लिए उदाहरणों पर काम नहीं करते हैं। आप public static void MyExtensions(this Enum value) का उपयोग कर बेस एनम का विस्तार कर सकते हैं। लेकिन यह अभी भी आपके द्वारा बनाए गए एनम उदाहरणों पर विधियां बनाएगा। एक वर्ग के लिए बाहरी रूप से बात कर रहे हैं जैसे स्थिर तरीकों को जोड़ने का एकमात्र तरीका यह है कि कक्षा आंशिक वर्ग है।

संपादित करें: कुछ करने के लिए की तरह आप चाहते हैं मैंने लिखा निम्नलिखित

public static bool IsFlagSet<T>(this Enum value, Enum flag) 
{ 
    if (!typeof(T).IsEnum) throw new ArgumentException(); 
    if (value == flag) return true; 
    return ((int)Enum.Parse(typeof(T), value.ToString()) & 
     (int)Enum.Parse(typeof(T), flag.ToString())) != 0; 
} 

* चेतावनी, इस विधि अधिक उपयोग करने के लिए, मैं आशा करती हूं वहाँ यह करने के लिए एक बेहतर तरीका है पहले सोचा किए जाने की आवश्यकता ।

+2

सामान्य बाधा की आवश्यकता नहीं है – shf301

2

मुझे लगता है कि आप enums के लिए विस्तार विधियों की तलाश कर रहे हैं। यहां एक प्रारंभिक लिंक है: http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using-Extension-Methods.aspx

+0

वास्तव में जो मैं खोज रहा हूं, वह नहीं है, Enum.SomeMethod() को MyCustomEnum.SomeMethod() – Joshscorp

+0

http: // web.archive.org/web/20100916130304/http://pietschsoft.com/post/2008/07/C-Enhance-Enums-using- एक्सटेंशन- methods.aspx, क्योंकि लिंक मेरे लिए नीचे था। – dividius

0

यहां परीक्षण सबसे अच्छा है जो मैं सोच सकता हूं। याद रखें कि enums 64 बिट इन्ट्स पर आधारित हो सकता है:

public static bool IsFlagSet(this Enum value, Enum flag) 
{ 
    if (Type.GetTypeHandle(value).Value != Type.GetTypeHandle(flag).Value) 
     throw new ArgumentException(); 
    return (Convert.ToInt64(value) & Convert.ToInt64(flag)) != 0L; 
} 
1

और एक और उदाहरण।

public static bool Includes<T>(this T value, T flag) where T : struct, IConvertible 
    { 
     var val = value.ToUInt32(null); 
     var fl = flag.ToUInt32(null); 
     return (val & fl) == fl; 
    } 

और उपयोग।

SomeEnum val = SomeEnum.One; 
bool isOne = val.Includes(SomeEnum.One); // == true 
bool isTwo = val.Includes(SomeEnum.Two); // == false 
संबंधित मुद्दे