enum

5

के लिए IRouteConstraint मैं एक आईआरओटीई कॉन्स्ट्रेनेंट बनाना चाहता हूं जो एक enum के संभावित मूल्यों के विरुद्ध एक मूल्य फ़िल्टर करता है। मैंने इसे अपने लिए Google पर करने का प्रयास किया, लेकिन इसके परिणामस्वरूप कुछ भी नहीं हुआ।enum

कोई विचार?

उत्तर

4

देखें this

अनिवार्य रूप से, आप

private Type enumType; 

    public EnumConstraint(Type enumType) 
    { 
    this.enumType = enumType; 
    } 

    public bool Match(HttpContextBase httpContext, 
    Route route, 
    string parameterName,  
    RouteValueDictionary values, 
    RouteDirection routeDirection) 
    { 
    // You can also try Enum.IsDefined, but docs say nothing as to 
    // is it case sensitive or not. 
    return Enum.GetNames(enumType).Any(s => s.ToLowerInvariant() == values[parameterName].ToString()); 
    } 
+0

मेरे ब्लॉग पर भी - http://mikemilleresq.wordpress.com/2010/03/12/starting-small-mvc-constraints/ –

+0

नीचे मेरा अंतिम परिणाम – Jaap

+0

'Enum.IsDefined()' केस संवेदनशील है, इसलिए यदि आपके मार्ग की बाधा को मामले के बावजूद काम करना चाहिए तो इससे बचा जाना चाहिए। – Chris

9

की जरूरत यह है कि मैं क्या के साथ आया है:

public class EnumRouteConstraint<T> : IRouteConstraint 
    where T : struct 
{ 

    private readonly HashSet<string> enumNames; 

    public EnumRouteConstraint() 
    { 
    string[] names = Enum.GetNames(typeof(T)); 
    enumNames = new HashSet<string>(from name in names select name.ToLowerInvariant()); 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
    return enumNames.Contains(values[parameterName].ToString().ToLowerInvariant()); 
    } 
} 

मुझे लगता है कि एक HashSet प्रत्येक पर Enum.GetNames तुलना में काफी बेहतर प्रदर्शन करेंगे मिलान। जब आप बाधा का उपयोग करते हैं तो उपयोग जेनरिक इसे थोड़ा और अधिक धाराप्रवाह दिखता है।

दुर्भाग्यवश, जहां टी: Enum संकलक द्वारा अनुमति नहीं है।

+1

* दुर्भाग्यवश, जहां टी: Enum को कंपाइलर द्वारा अनुमति नहीं है * यह सच है, लेकिन आप अभी भी रनटाइम पर इसे लागू करने का प्रयास कर सकते हैं। http://stackoverflow.com/a/2936591/242520 –

+2

कन्स्ट्रक्टर Enum.GetNames (टाइपोफ (टी)) टी अपवाद नहीं है तो अपवाद फेंकता है: ArgumentException: प्रदान किया गया प्रकार एक एनम होना चाहिए। – Jaap

+1

यह अच्छी तरह से काम करता है। धन्यवाद, @ जैप – Chris