2013-01-17 6 views
8

सी # enum मान केवल इसकी परिभाषा में सूचीबद्ध मानों तक सीमित नहीं हैं और इसके मूल प्रकार के किसी भी मूल्य को स्टोर कर सकते हैं। यदि आधार प्रकार Int32 से परिभाषित नहीं किया गया है या बस int का उपयोग किया जाता है।क्या डेटा एन्नोटेशन नेमस्पेस में एनम मानों के लिए बॉक्स सत्यापनकर्ता है?

मैं एक डब्ल्यूसीएफ सर्विसेज विकसित कर रहा हूं जिसे विश्वास करने की आवश्यकता है कि कुछ enum के पास 0 के सभी enums के लिए डिफ़ॉल्ट मान के विपरीत एक मान दिया गया है। मैं एक यूनिट परीक्षण से शुरू करता हूं यह पता लगाने के लिए कि [Required] सही काम करेगा ।

using System.ComponentModel.DataAnnotations; 
using Xunit; 

public enum MyEnum 
{ 
    // I always start from 1 in order to distinct first value from the default value 
    First = 1, 
    Second, 
} 

public class Entity 
{ 
    [Required] 
    public MyEnum EnumValue { get; set; } 
} 

public class EntityValidationTests 
{ 
    [Fact] 
    public void TestValidEnumValue() 
    { 
     Entity entity = new Entity { EnumValue = MyEnum.First }; 

     Validator.ValidateObject(entity, new ValidationContext(entity, null, null)); 
    } 

    [Fact] 
    public void TestInvalidEnumValue() 
    { 
     Entity entity = new Entity { EnumValue = (MyEnum)(-126) }; 
     // -126 is stored in the entity.EnumValue property 

     Assert.Throws<ValidationException>(() => 
      Validator.ValidateObject(entity, new ValidationContext(entity, null, null))); 
    } 
} 

ऐसा नहीं है, दूसरा परीक्षण कोई अपवाद नहीं फेंकता है।

मेरा प्रश्न है: क्या यह सत्यापित करने के लिए एक वैधकर्ता विशेषता है कि आपूर्ति मूल्य Enum.GetValues में है?

अद्यतनValidateObject(Object, ValidationContext, Boolean) का उपयोग अपने यूनिट परीक्षण में किए गए ValidateObject(Object, ValidationContext) के बजाय True के बराबर अंतिम पैरामीटर के साथ करना सुनिश्चित करें।

+0

मैं इसे इस्तेमाल कभी नहीं किया, इसलिए मुझे नहीं पता कि यह मानों की जांच करता है, लेकिन आप EnumDataTypeAttribute को आजमा सकते हैं: http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.enumdatatypeattribute%28v=vs.95%29 इसके लिए .aspx –

उत्तर

14

.NET4 + में EnumDataType नहीं है ...

आप ValidateObject

तो अपने उदाहरण से करने के लिए कॉल में 3 पैरामीटर, validateAllProperties=true सेट सुनिश्चित करें:

public class Entity 
{ 
    [EnumDataType(typeof(MyEnum))] 
    public MyEnum EnumValue { get; set; } 
} 

[Fact] 
public void TestInvalidEnumValue() 
{ 
    Entity entity = new Entity { EnumValue = (MyEnum)(-126) }; 
    // -126 is stored in the entity.EnumValue property 

    Assert.Throws<ValidationException>(() => 
     Validator.ValidateObject(entity, new ValidationContext(entity, null, null), true)); 
} 
+0

शामिल करना था' बस [आवश्यक] 'से' [EnumDataType (typeof (MyEnum))] पर स्विच किया गया है और परीक्षण किया गया है, अभी भी कोई भी 'सत्यापन अपवाद' – Mike

+0

क्या आपने दोनों विशेषताओं को आजमाया है? – qujck

+0

यकीन है कि मैंने – Mike

10

क्या आप के लिए देख रहे हैं:

Enum.IsDefined(typeof(MyEnum), entity.EnumValue) 

[अपडेट + 1]

बॉक्स सत्यापनकर्ता है कि यह एक EnumDataType कहा जाता है सहित सत्यापन का एक बहुत करता है से बाहर। सुनिश्चित करें कि आप ValateateObject के रूप में मान्य AllProperties = true सेट करें, अन्यथा आपका परीक्षण विफल हो जाएगा।

तुम सिर्फ अगर enum परिभाषित किया गया है, तो आप इसके बाद के संस्करण लाइन के साथ एक कस्टम सत्यापनकर्ता उपयोग कर सकते हैं जाँच करना चाहते हैं:

[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method, AllowMultiple = false)] 
    public sealed class EnumValidateExistsAttribute : DataTypeAttribute 
    { 
     public EnumValidateExistsAttribute(Type enumType) 
      : base("Enumeration") 
     { 
      this.EnumType = enumType; 
     } 

     public override bool IsValid(object value) 
     { 
      if (this.EnumType == null) 
      { 
       throw new InvalidOperationException("Type cannot be null"); 
      } 
      if (!this.EnumType.IsEnum) 
      { 
       throw new InvalidOperationException("Type must be an enum"); 
      } 
      if (!Enum.IsDefined(EnumType, value)) 
      { 
       return false; 
      } 
      return true; 
     } 

     public Type EnumType 
     { 
      get; 
      set; 
     } 
    } 

... लेकिन मुझे लगता है कि यह बॉक्स से बाहर नहीं है तो यह क्या है?

+0

+1 lpful विधि। यह वर्षों से वहां रहा है, लेकिन मैंने इसे कभी नहीं देखा है – Mike

+0

@ राफेल अलाथॉस आप बिल्कुल सही हैं। इसके लिए खेद है, मेरा जवाब बदल दिया और इसका परीक्षण किया, यह काम करता है। – atlaste

+0

@StefandeBruijn ठीक और +1 –

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