internal sealed class MeetingValidator : AbstractValidator<Meeting> 
{
    public MeetingValidator()
    {
      RuleFor(m => new { m.Start, m.End })
        .Must(d => d.End - d.Start > 0)

      // Other Rules
    }
}

有没有办法在匿名类型上声明AbstractValidator?

这是为了重构目的.

该测试对除会议之外的其他类型是常见的,我希望最大限度地减少代码的重复.

internal sealed class EndDateValidator : AbstractValidator<????> 
{
    public EndDateValidator ()
    {
      RuleFor(m => ????)
        .Must(d => d.End - d.Start > 0)
    }
}


public static IRuleBuilderOptions<T, ????> MustHaveAEndStartDate<T>(this IRuleBuilder<T,  ????> ruleBuilder)
{
    return ruleBuilder.SetValidator(new EndDateValidator());
}


internal sealed class MeetingValidator : AbstractValidator<Meeting> 
{
    public MeetingValidator()
    {
      RuleFor(m => new { m.Start, m.End }) // or something else
        .MustHaveValidEndDate()
    }
}

推荐答案

如果您不能重构源类(这里:Meeting),那么您可以使用(DateTime Start, DateTime End) ValueTuple而不是匿名类型,将验证器定义为继承自AbstractValidator<(DateTime Start, DateTime End)>.

internal sealed class MeetingValidator : AbstractValidator<Meeting>
{
    public MeetingValidator()
    {
        RuleFor<(DateTime, DateTime)>(o => new(o.Start, o.End))
            .MustHaveValidEndDate();
    }
}

internal sealed class EndDateValidator : AbstractValidator<(DateTime Start, DateTime End)>
{
    public EndDateValidator()
    {
        RuleFor(o => o).Must(o => o.End > o.Start);
    }
}

public static class Extensions
{
    public static IRuleBuilderOptions<T, (DateTime Start, DateTime End)> MustHaveValidEndDate<T>(
        this IRuleBuilder<T, (DateTime Start, DateTime End)> ruleBuilder
        )
    {
        return ruleBuilder.SetValidator(new EndDateValidator());
    }
}

Csharp相关问答推荐

哪个nuget包含SecurityStampValidatorOptions

LINQ无法翻译SQLFunctions方法

C#方法从AJAX调用接收NULL

如何使用C#获取FireStore中的列表输出文档

由于POST中的应用程序/JWT,出现不支持的内容类型异常

如何使用NumberFormatInfo

如何通过寻找向量长度来优化两个循环?

显示文档的ECDsa签名PDF在Adobe Reader中签名后已被更改或损坏

在C#中反序列化/序列化具有混合元素顺序的XML时出现问题

DbContext-传递自定义配置选项

具有类型识别的泛型方法

获取混淆&Quot;模糊引用&Quot;错误

C#中类库项目的源代码生成器

如何使用类似于[SELECT*FROM&Q;&Q;WHERE&Q;]SQL查询的System.Data.Entity创建查询?

忽略Visual Studio代码中的StyleCop规则

如何消除Visual Studio错误,因为它不识别集合表达式的新C#12语法?

如何保存具有多个重叠图片框的图片框?

单位中快照的倾斜方向

S,在.NET核心控制台应用程序中,AddScope和AddSingleton有什么不同?

如何使用moq和xUnit对删除操作进行单元测试?