Для будущих людей, рассматривающих эту проблему, я пытался написать атрибут проверки, который оценивал бы регулярное выражение, если бы свойство объекта имело определенное значение. В моем случае, если адрес был адресом доставки, я не хотел, чтобы почтовые ящики были включены, поэтому я пришел к следующему:
Использование
[Required]
public EAddressType addressType { get; set; } //Evaluate Validation attribute against this
[EvaluateRegexIfPropEqualsValue(Constants.NOT_PO_BOX_REGEX, "addressType", EAddressType.Shipping, ErrorMessage = "Unable to ship to PO Boxes or APO addresses")]
public String addressLine1 { get; set; }
А вот код для атрибута проверки:
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class EvaluateRegexIfPropEqualsValue : ValidationAttribute
{
Regex _regex;
string _prop;
object _targetValue;
public EvaluateRegexIfPropEqualsValue(string regex, string prop, object value)
{
this._regex = new Regex(regex);
this._prop = prop;
this._targetValue = value;
}
bool PropertyContainsValue(Object obj)
{
var propertyInfo = obj.GetType().GetProperty(this._prop);
return (propertyInfo != null && this._targetValue.Equals(propertyInfo.GetValue(obj, null)));
}
protected override ValidationResult IsValid(object value, ValidationContext obj)
{
if (this.PropertyContainsValue(obj.ObjectInstance) && value != null && !this._regex.IsMatch(value.ToString()))
{
return new ValidationResult(this.ErrorMessage);
}
return ValidationResult.Success;
}
}