我在 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 類,所以我希望它們保持沒有繼承關系。
uj5u.com熱心網友回復:
實際上,如果您需要在一種方法中驗證兩種不同型別的物件,則不必弄亂從泛型類的繼承。
有一種簡單的方法可以做到這一點。任何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>
{
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/329742.html
上一篇:根據型別層次創建映射函式
