有条件地转 on/off DataAnnotation 属性 验证

Conditionally turn on/off DataAnnotation property validation

我不熟悉使用 DataAnnotations 进行验证。我在控制台应用程序中使用它,所以不是 ASP/MVC,等等

public class Phone
{
   [Required]
   public string Mobile { get; set; }

   [Required]
   public string Office { get; set; }
}

public class Physician
{
    [Required]
    public Phone ContactPhone { get; set; }
}

public class Patient
{
    [Required]
    public Phone ContactPhone { get; set; }
}

现在,考虑对于 Physician 对象,Mobile 和 Office 是必需的,但是对于 Patient 对象,仅 Mobile 是必需的。我怎样才能根据给定条件转变 on/off 验证属性行为?

听起来 PhysicianPatient classes 需要决定在 Phone class 中什么是必需的,什么不是必需的。我们可以通过首先避免注释来实现这一点,而是使用 IValidatableObject 接口。 Validator class 还将检查此接口以进行任何其他验证。

public class Phone
{
    // no more required attributes here
    public string Mobile { get; set; }

    public string Office { get; set; }
}

public class Physician : IValidatableObject
{
    [Required]
    public Phone ContactPhone { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if(string.IsNullOrWhiteSpace(ContactPhone.Mobile))
        {
            yield return new ValidationResult("Mobile number is required");
        }

        if (string.IsNullOrWhiteSpace(ContactPhone.Office))
        {
            yield return new ValidationResult("Office number is required");
        }
    }
}

public class Patient : IValidatableObject
{
    [Required]
    public Phone ContactPhone { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (string.IsNullOrWhiteSpace(ContactPhone.Mobile))
        {
            yield return new ValidationResult("Mobile number is required");
        }
    }
}