using FluentValidation; using FluentValidation.Results; using System; using System.Threading; using System.Threading.Tasks; namespace zero.Core.Validation { public abstract class ZeroValidator : ZeroValidator { } public abstract class ZeroValidator : AbstractValidator, IValidator where TImplementation : TInterface { public ValidationResult Validate(TInterface instance) { if (!(instance is TImplementation)) { throw new ArgumentException($"Parameter {nameof(instance)} has to be of type {typeof(TImplementation)}."); } return base.Validate((TImplementation)instance); } public Task ValidateAsync(TInterface instance, CancellationToken cancellation = default) { if (!(instance is TImplementation)) { throw new ArgumentException($"Parameter {nameof(instance)} has to be of type {typeof(TImplementation)}."); } return base.ValidateAsync((TImplementation)instance, cancellation); } } }