我目前正在编写的程序需要检查用户给出的年份是否在一定范围内。底部值是一个固定值,但这个范围的顶部应该以当前年份为上限,并在我们进入新的一年时自我更新。我已经尝试使用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
不会。
不幸的是,RangeAttribute
的Maximum
属性不是虚拟的,所以你不能覆盖它。
这个问题可以通过从ValidationAttribute
而不是从RangeAttribute
继承的自定义属性来解决。然后,您可以重新实现RangeAttribute
的逻辑(在这里可以获得源代码)。你可以抛弃大部分的参考实现,只为int
实现所有的逻辑。