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