【发布时间】:2019-03-28 01:30:18
【问题描述】:
当我尝试编写验证器时,我发现 FluentValidation (v8.2.0) 存在一个奇怪的问题:
System.InvalidCastException H结果=0x80004002 消息=无法将“BaseModel”类型的对象转换为“DerivedModel”类型。 来源=FluentValidation 堆栈跟踪: 在 FluentValidation.Internal.ConditionBuilder
1.<>c__DisplayClass2_0.<When>g__Condition|0(ValidationContext context) in C:\Projects\FluentValidation\src\FluentValidation\Internal\ConditionBuilder.cs:line 62 at FluentValidation.Internal.PropertyRule.<Validate>d__67.MoveNext() in C:\Projects\FluentValidation\src\FluentValidation\Internal\PropertyRule.cs:line 270 at System.Linq.Enumerable.SelectManySingleSelectorIterator2.MoveNext() 在 System.Linq.Enumerable.WhereEnumerableIterator1.MoveNext() at FluentValidation.AbstractValidator1.Validate(ValidationContext`1 context) 在 C:\Projects\FluentValidation\src\FluentValidation\AbstractValidator.cs:line 115 在 C:\Users\john\Documents\Visual Studio 2017\Projects\TestApp\TestApp\Program.cs:line 76 中的 TestApp.Program.d__4.MoveNext() 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 TestApp.Program.(String[] args)
我的模型和验证器:
public class BaseModel
{
public string Name { get; set; }
public bool IsAlive { get; set; }
}
public class DerivedModel : BaseModel
{
public int Age { get; set; }
}
public class BaseModelValidator : AbstractValidator<BaseModel>
{
public BaseModelValidator()
{
RuleFor(o => o.Name).Length(1, 20);
}
}
public class DerivedModelValidator : AbstractValidator<DerivedModel>
{
public DerivedModelValidator(BaseModelValidator baseValidator)
{
foreach (var rule in baseValidator)
{
AddRule(rule);
}
RuleFor(o => o.Age).GreaterThanOrEqualTo(0);
}
}
我正在使用的代码:
var baseModelValidator = new BaseModelValidator();
var derivedModelValidator = new DerivedModelValidator(baseModelValidator);
var baseModel = new BaseModel
{
IsAlive = true,
Name = "test2"
};
Console.WriteLine(baseModelValidator.Validate(baseModel).IsValid);
如您所见,我使用BaseModelValidator 来验证BaseModel,而这个引用DerivedModel 没有。
有趣的是,如果我删除 var derivedModelValidator = new DerivedModelValidator(baseModelValidator); 行,它可以正常工作。
是什么导致了这个异常以及如何解决它?
【问题讨论】:
标签: c# fluentvalidation