是否可以在类型级别而不是单个C#属性设置器上添加验证?

是否可以在类型级别而不是单个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

具有多个端点的API向使用者公开。在payload对象中,我们有可为空的DateTime和可为空的Decimal属性(DateTime?&Decimal?)。由于消费者端的一些内部技术难题,他们无法发送DateTime的NULL?还是十进制?财产

我们需要支持他们的请求,他们提出了一些超出限制的值,以便将系统视为空值。例如:DateTime中的“1900-01-31”?字段应被视为NULL或十进制的99999.00?字段应视为空

到目前为止,我在individual property setter中提出了以下解决方案:

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;
        }
}