我如何检查一个范围,其中较高的值是动态的c# ?



我目前正在编写的程序需要检查用户给出的年份是否在一定范围内。底部值是一个固定值,但这个范围的顶部应该以当前年份为上限,并在我们进入新的一年时自我更新。我已经尝试使用DateTime.Now.Year赋值给int值进行比较,但是range无法比较非静态值。

[Range(1900, 2022, ErrorMessage = "Property built before 1900.")]

上面是有问题的行。任何建议吗?

属性不能这样做。属性必须使用常量值。您既可以验证方法中的数据,也可以使用最小值(因为它似乎是一个常量)。

您不能将RangeAttribute用于此任务,因为它只能在min/max的恒定值下工作。

但是您可以为这个任务自定义验证属性。就像

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
public class YearRangeAttribute : RangeAttribute
{
public YearRangeAttribute(int minimum) : base(minimum, DateTime.Now.Year)
{
}
}

这里我们对构造函数隐藏maximum值,并在内部将其设置为当前年份。在其他方面,我们的新属性作为一个普通的RangeAttribute

这里的问题是,maximimum在属性实例创建时是固定的。因此,如果您在12月31日启动程序,那么在运行24小时后您将遇到问题,因为实际年份将发生变化,但您的maximum不会。

不幸的是,RangeAttributeMaximum属性不是虚拟的,所以你不能覆盖它。

这个问题可以通过从ValidationAttribute而不是从RangeAttribute继承的自定义属性来解决。然后,您可以重新实现RangeAttribute的逻辑(在这里可以获得源代码)。你可以抛弃大部分的参考实现,只为int实现所有的逻辑。

最新更新