2013-01-17 43 views
8

C#枚舉值不僅限於它的定義中列出的值,並且可以存儲它的任何基類型值。如果基本類型未定義爲Int32或僅使用intDataAnnotations命名空間中的枚舉值是否有現成的驗證器?

我正在開發一個WCF服務器,它需要確信某些枚舉的值已被賦值,而不是所有枚舉爲0的默認值。我從一個單元測試開始,以確定[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

更新。 確保使用最後一個參數爲True而不是ValidateObject(Object, ValidationContext)ValidateObject(Object, ValidationContext, Boolean),正如我在單元測試中所做的那樣。

+0

我從來沒有使用過,所以我不知道它是否檢查值,但你可以嘗試EnumDataTypeAttribute:http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.enumdatatypeattribute%28v=vs.95%29 .aspx –

回答

14

在.NET4 +有EnumDataType ...

確保您的通話設置的第三個參數,validateAllProperties=trueValidateObject

所以從你的例子:

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))]'並且測試過,仍然沒有'ValidationException' – Mike

+0

您是否嘗試了兩個屬性? – qujck

+0

肯定我已經試過兩個也 – Mike

10

什麼你要找的是:

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

[更新+ 1]

的開箱驗證,做了很多的驗證,包括這一個被稱爲EnumDataType的。確保將validateAllProperties = true設置爲ValidateObject,否則您的測試將失敗。

如果你只是想檢查枚舉定義,你可以使用自定義驗證上述行:

[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這個他有趣的方法。它已在那裏多年,但我從來沒有注意到它 – Mike

+0

@RaphaëlAlthaus你是絕對正確的。對不起,這改變了我的答案,並測試它,這個工程。 – atlaste

+0

@StefandeBruijn罰款和+1 –

相關問題