是否可以在类型级别而不是单个C#属性设置器上添加验证?
具有多个端点的API向使用者公开。在payload对象中,我们有可为空的DateTime和可为空的Decimal属性(DateTime?&Decimal?)。由于消费者端的一些内部技术难题,他们无法发送DateTime的NULL?还是十进制?财产 我们需要支持他们的请求,他们提出了一些超出限制的值,以便将系统视为空值。例如:DateTime中的“1900-01-31”?字段应被视为NULL或十进制的99999.00?字段应视为空 到目前为止,我在individual property setter中提出了以下解决方案:是否可以在类型级别而不是单个C#属性设置器上添加验证?,c#,asp.net-web-api,C#,Asp.net Web Api,具有多个端点的API向使用者公开。在payload对象中,我们有可为空的DateTime和可为空的Decimal属性(DateTime?&Decimal?)。由于消费者端的一些内部技术难题,他们无法发送DateTime的NULL?还是十进制?财产 我们需要支持他们的请求,他们提出了一些超出限制的值,以便将系统视为空值。例如:DateTime中的“1900-01-31”?字段应被视为NULL或十进制的99999.00?字段应视为空 到目前为止,我在individual property sette
private DateTime? _budgetEffectiveDate;
public DateTime? BudgetEffectiveDate
{
get
{
return _budgetEffectiveDate;
}
set
{
_budgetEffectiveDate = value;
if (_budgetEffectiveDate.ToString() == "1/31/1900 12:00:00 AM")
_budgetEffectiveDate = null;
}
}
修复对他们来说效果很好,但是需要对数百个C#属性设置器进行同样的更改。是否有一种通用的方法可以在数据类型级别实现这一点,而无需单独修改每个属性?如何定义自己的类型,通过添加边界检查来扩展
DateTime
?例如(未测试)
类NullableBoundedDateTime
{
私有日期时间下限;
私有日期时间上限;
公共日期时间
{
得到
{
if(日期时间<下限| |日期时间>上限)
返回null;
返回日期时间;
}
设置
{
日期时间=值;
}
}
然后重构您的代码以使用该类而不是
DateTime?
。相同的概念可以应用于其他类型。您可以使用自定义json转换器,一个用于DateTime,一个用于小数,然后您可以将其用作特定属性的属性,或者将其添加到“全局”配置中,这将使它们用于n所有类型。if(\u BudgetFectiveDate.ToString()=“1/31/1900 12:00:00 AM”)
不要这样做。此代码在澳大利亚或其他许多地方不起作用。该死,它在美国的许多电脑上都不起作用。验证也不应该包含在类型中,请将验证代码放在其他地方创建一个自定义模型绑定器,设置所有日期时间?
参数的值。告诉他们解决不存在的问题“技术困难"<代码> 1900—01-31 是一个完全有效的日期。如果他们想省略日期,他们应该按照JSON标准指定一个<代码> null <代码>,或者省略属性——考虑使用这个来写一个集中式的代码> StValue。因为这会影响所有属性,那么你可能想把它们自己的类放进去。单独的项目。
class NullableBoundedDateTime
{
private DateTime lowerBound;
private DateTime upperBound;
public DateTime? dateTime
{
get
{
if (dateTime < lower || dateTime > upper)
return null;
return dateTime;
}
set
{
dateTime= value;
}
}