I valori di enumerazione C# non sono limitati ai soli valori elencati nella sua definizione e possono memorizzare qualsiasi valore del suo tipo di base. Se il tipo di base non è definito rispetto a Int32
o semplicemente int
viene utilizzato.Esiste validatore immediato per i valori Enum nello spazio dei nomi DataAnnotations?
Sto sviluppando un servizio WCF che deve essere sicuro che ad alcuni enum è assegnato un valore rispetto al valore predefinito per tutte le enumerazioni di 0. Comincio con un test unitario per scoprire se [Required]
farebbe bene il lavoro qui .
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)));
}
}
In caso contrario, il secondo test non genera eccezioni.
La mia domanda è: c'è un attributo validatore per verificare che il valore fornito sia Enum.GetValues
?
Aggiornamento. Assicurarsi di utilizzare ValidateObject(Object, ValidationContext, Boolean)
con l'ultimo parametro uguale a True
anziché ValidateObject(Object, ValidationContext)
come eseguito nel test dell'unità.
ho mai usato, quindi non so se controlla i valori, ma potresti provare EnumDataTypeAttribute: http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.enumdatatypeattribute%28v=vs.95%29 .aspx –