In the last post, I went through the steps to make a custom validation attribute - if you missed it, check it out here:
Creating Custom Validation Attribute. Now let's say we want to make our validator to look up on the value "37" from another property in our class (instead of hard-coding it). How do we do that? With the help of reflection, we can do that quite easily.
Here is our modified class:
In our new custom validator, we override a different IsValid method (the original one is commented out):
That's it!
Additional reading:
public class MyClass { // ... more code [MagicNumber("ThirtySeven", ErrorMessage = "Sum is not correct")] public int MyData { get; set; } // ... more code public int ThirtySeven { get { return 37; } } // ... more code }
In our new custom validator, we override a different IsValid method (the original one is commented out):
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] sealed public class MagicNumberAttribute : ValidationAttribute { // constructor to accept the comparison property name public MagicNumberAttribute(string thirtySevenProperty) : base() { if (thirtySevenProperty == null) { throw new ArgumentNullException("thirtySevenProperty"); } ThirtySevenProperty= thirtySevenProperty; } // property to store the comparison field name public string ThirtySevenProperty{ get; private set; } // public override bool IsValid(object value) { // var num = int.Parse(value.ToString()); // return num == 37; // } protected override ValidationResult IsValid(object value, ValidationContext validationContext) { // get property info of the "ThirtySevenProperty" PropertyInfo thirtySevenPropertyInfo = validationContext.ObjectType.GetProperty(ThirtySevenProperty); // check if that property exists / valid if (thirtySevenPropertyInfo == null) { return new ValidationResult(String.Format(CultureInfo.CurrentCulture, "UNKNOWN PROPERTY", ThirtySevenProperty)); } // get the value of the property object thirtySevenPropertyValue = thirtySevenPropertyInfo.GetValue(validationContext.ObjectInstance, null); // do comparison and return validation result with error if not equal if (!Equals(value, thirtySevenPropertyValue)) { return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); } // return null if everything is ok return null; } }
That's it!
Additional reading:
1 comment:
Nice post!
Post a Comment