public int HourlyRate {get;set;}
public ChildClass Child{get;set;}
public string Name {get;set;}
public class PersonValidator : AbstractValidator<Person>
RuleFor(validateField => validateField.HourlyRate)
.Cascade(CascadeMode.Stop)
.Must(HourlyRateValidation)
.WithMessage("not in range");
RuleFor(f=>f).ChildRules(parent=>
.Cascade(CascadeMode.Stop)
.Must(x=>x.Contains("bob"))
private bool HourlyRateValidation(int hourlyRate)
return hourlyRate >= 10 && hourlyRate <= 100;
public static void Main()
var fail1 = new Person { HourlyRate=9,Child=new (){Name="jack"}};
var fail2 = new Person { HourlyRate=101,Child=new (){Name=""}};
var pass1 = new Person {HourlyRate=10,Child=new (){Name="bob"}};
var pass2 = new Person { HourlyRate=100,Child=new (){Name="bob"}};
var validator = new PersonValidator();
PrintValidationResult(validator.Validate(fail1),"fail1:");
PrintValidationResult(validator.Validate(fail2),"fail2:");
PrintValidationResult(validator.Validate(pass1),"pass1:");
PrintValidationResult(validator.Validate(pass2),"pass2:");
public static void PrintValidationResult(FluentValidation.Results.ValidationResult result,string objectName)
Console.WriteLine(objectName);
Console.WriteLine("✅ Validation successful");
foreach (var error in result.Errors)
Console.WriteLine("❌ " + error.ErrorMessage);