- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我尝试编写验证器时,我发现 FluentValidation (v8.2.0) 出现了一个奇怪的问题:
System.InvalidCastException HResult=0x80004002 Message=Unable to cast object of type 'BaseModel' to type 'DerivedModel'. Source=FluentValidation StackTrace: at FluentValidation.Internal.ConditionBuilder
1.<>c__DisplayClass2_0.<When>g__Condition|0(ValidationContext context) in C:\Projects\FluentValidation\src\FluentValidation\Internal\ConditionBuilder.cs:line 62
2.MoveNext() at System.Linq.Enumerable.WhereEnumerableIterator
at FluentValidation.Internal.PropertyRule.<Validate>d__67.MoveNext() in C:\Projects\FluentValidation\src\FluentValidation\Internal\PropertyRule.cs:line 270
at System.Linq.Enumerable.SelectManySingleSelectorIterator1.MoveNext()
1.Validate(ValidationContext`1 context) in C:\Projects\FluentValidation\src\FluentValidation\AbstractValidator.cs:line 115 at TestApp.Program.d__4.MoveNext() in C:\Users\john\Documents\Visual Studio 2017\Projects\TestApp\TestApp\Program.cs:line 76 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at TestApp.Program.(String[] args)
at FluentValidation.AbstractValidator
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);
, 它可以正常工作。
是什么导致了这个异常,我该如何解决?
最佳答案
我实际上偶尔会在我的 Web 应用程序中看到这个问题 - 99% 的时间它都可以正常工作,但偶尔我会遇到这个问题。我 reached out致 FluentValidation 的作者 Jeremy Skinner,他解释了正在发生的事情:
Rules are intrinsicly tied to the validators that define them. They are not designed to be copied from one validator to another. They are inherently tied to the validator that defined them, and the type they were defined against.
Each condition block has a unique ID associated with it (that allows the result of the condition to be cached, so it's only executed one and not for each rule inside it). When you copy rules from one validator to another, the condition is brought across as well.
简而言之:您不能在验证器之间共享单个规则对象。
有问题的代码是 DerivedModelValidator
中的这个 block :
foreach (var rule in baseValidator)
{
AddRule(rule);
}
Jeremy 针对这个问题提供了两种不同的解决方案:
public abstract class CommonModelValidator<T> : AbstractValidator<T> where T : BaseModel
{
protected CommonModelValidator()
{
RuleFor(o => o.Name).Length(1, 20);
}
}
public class BaseModelValidator : CommonModelValidator<BaseModel>
{
}
public class DerivedModelValidator : CommonModelValidator<DerivedModel>
{
public DerivedModelValidator(BaseModelValidator baseValidator)
: base()
{
RuleFor(o => o.Age).GreaterThanOrEqualTo(0);
}
}
SetValidator
从 BaseModelValidator
组成 DerivedModelValidator
:public class BaseModelValidator : AbstractValidator<BaseModel>
{
public BaseModelValidator()
{
RuleFor(o => o.Name).Length(1, 20);
}
}
public class DerivedModelValidator : AbstractValidator<DerivedModel>
{
public DerivedModelValidator(BaseModelValidator baseValidator)
{
RuleFor(o => o).SetValidator(baseValidator);
RuleFor(o => o.Age).GreaterThanOrEqualTo(0);
}
}
关于c# - 验证正在抛出 "Unable to cast object of type ' BaseModel' 以键入 'DerivedModel'。”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55388890/
使用 Pydantic 的数据类 vs BaseModel 的优缺点是什么?是否存在任何性能问题,或者 Pydantic 的数据类在其他 python 模块中是否更容易? 最佳答案 Pydantic
我目前正在使用 Odoo 移动框架构建一个应用程序。当我在我的project structure中的base.addons下查找BaseModels java类时,我找不到像 example 那样的类
我有一个包含所有必要参数的类。但是,对于 init 函数,它要求关键字参数,并且不接受位置参数。所以,我的问题是:我可以在 pydantic.BaseModel 的配置中更改某些内容以允许位置参数吗?
我开始学习 FastAPI 和 Pydantic 并且有疑问。我有 BaseModel 的以下子类 class Product(BaseModel): image: str name: str
我有一类属性,这些属性是从我需要在我的 MVC 应用程序的每个 View 上都可用的服务中设置的。 因此,我创建了一个“基础 View 模型”,我的 View 模型将从中继承。 public clas
我正在使用 Sequelize 作为数据 ORM。 我有一个简单的用户类。 import { Model } from "sequelize"; class User extends BaseMode
我正在为我的 API 客户端编写测试。我需要模拟 get 函数,以便它不会发出任何请求。因此,我不想返回 Response 对象,而是返回 MagicMock。但随后 pydantic 会引发 Val
我正在用 PHP 编写自己的 MVC 框架,仅用于学习目的。让路由器/调度程序类调用正确的 Controller /操作等并不难。 但是现在我要使用模型了。或者实际上,模型层。但有些事情让我感到困惑。
我似乎找不到任何简单地将 Pydantic BaseModel 列表转换为 Pandas Dataframe 的内置方法。 from pydantic import BaseModel import
我按照说明操作: 创建 bean。此 bean 用于使用 RestyGWT 从服务器传输到客户端的枚举。 public enum Mode{ MODIFY, EDIT, DELETE,
我正在使用 pydantic 检查参数文件的格式。如果参数名称中有拼写错误,我希望 pydantic 引发错误,但它没有。 例如,以下不会引发任何错误: from typing import Opti
考虑这段代码: from pydantic import BaseModel class MyModel(BaseModel): x: int appc = Celery(...) @appc.t
我昨天刚开始玩 Sencha 的 Ext GWT,但遇到了困难。我结合了 JSON 加载网格和可编辑网格中的方法。作为测试数据集,我使用《星际之门:亚特兰蒂斯》剧集列表,因此 SGAEpisode 定
我有以下使用 Pydantic BaseModel 数据类的代码 from enum import Enum import requests from pydantic import BaseMode
我想排除所有在创建 JSON 时未设置的 Optional 值。在这个例子中: from pydantic import BaseModel from typing import Optional c
这是关于@Andre Calil 在以下 SO 中提供的解决方案的问题 Razor MVC, where to put global variables that's accessible acros
当我尝试编写验证器时,我发现 FluentValidation (v8.2.0) 出现了一个奇怪的问题: System.InvalidCastException HResult=0x80004002
我是一名优秀的程序员,十分优秀!