public class TrackValidator : AbstractValidator<Track> { public TrackValidator() { RuleFor(track => track.Artist).Length(0, 30).WithMessage("Artist is required"); RuleFor(track => track.Artist).Length(0, 40).WithMessage("Title is required"); RuleFor(track => track.Starred).NotNull().Equal(x => true).Unless(track => track.Rating. HasValue && track.Rating > 0 && track.Rating < 10); RuleFor(track => track.Rating).NotNull().GreaterThan(0).LessThan(10).Unless(track => track. Starred.HasValue && track.Starred.Value); } } public class Track : IValidatableObject { public int Id { get; set; } public string Artist { get; set; } public string Title { get; set; } public int? Rating { get; set; } public bool? Starred { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { var validator = new TrackValidator(); var result = validator.Validate(this); return result.Errors.Select(item => new ValidationResult(item.ErrorMessage, new[]{ item.PropertyName })); } }