【问题标题】:generic method validating data using FluentValidation使用 FluentValidation 验证数据的通用方法
【发布时间】:2021-10-19 09:49:26
【问题描述】:

我在 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

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

【问题讨论】:

    标签: c# inheritance fluentvalidation


    【解决方案1】:

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

    有一个简单的方法可以做到这一点。任何Validate 方法都返回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>
        {
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 2016-05-05
      • 2012-12-08
      • 1970-01-01
      相关资源
      最近更新 更多