使用 FluentValidation 验证数据的通用方法

generic method validating data using FluentValidation

我在 C# 项目中使用 FluentValidator。 我想创建一个通用方法来验证来自 2 种可能类型的数据:

public class MyClassAValidator : AbstractValidator<MyClassA> {...}
public class MyClassBValidator : AbstractValidator<MyClassB> {...}

public void MyMt<T>(T param)
{
  AbstractValidator<T> validator = null;
  if(param is MyClassA)
  {
   var validator = new MyClassAValidator(); // Generatescompiler error
  }
  else if (cCOSLDto is CCOSLLoyerDto)
  {
    validator = new MyClassBValidator(); // Generatescompiler error
  }
  ValidationResult result = validator.Validate(param);
 }

编译器无法将 MyClassAValidator() 或 MyClassBValidator() 转换为 AbstractValidator

我该如何处理? 我怀疑(虽然只是怀疑)如果我将基数 class 设置为 MyClassA 和 MyClassB,它会起作用。但我想尽可能避免这种情况,因为 MyClassA 和 MyClassB 实际上是 DTO classes 所以我希望它们保持没有继承关系。

实际上,如果您需要在一个方法中验证两种不同类型的对象,您不必搞乱从泛型继承 class。

有一种简单的方法可以做到这一点。任何 Validate 方法 returns ValidationResult,所以你可以使用这样的东西:

using FluentValidation;
using FluentValidation.Results;
using System;

namespace FluentValidatorTranslation
{
    class Program
    {
        static void Main(string[] args)
        {
            
        }

        public ValidationResult MyMt<T>(T param)
        {
            ValidationResult result;
            if(param is MyClassA myClassA)
            {
                var validator = new MyClassAValidator();
                result = validator.Validate(myClassA);
            }
            else if (param is MyClassB myClassB)
            {
                var validator = new MyClassBValidator();
                result = validator.Validate(myClassB);
            }
            else
            {
                throw new ArgumentException("Type not supported");
            }

            return result;
        }

    }

    public class MyClassA { }

    public class MyClassB { }

    public class MyClassAValidator : AbstractValidator<MyClassA>
    {

    }

    public class MyClassBValidator : AbstractValidator<MyClassB>
    {

    }

}