如何在 C# 中检查较高值是动态的范围?

How do I check a range where the higher value is dynamic in C#?

提问人:Masterseth98 提问时间:6/20/2022 更新时间:6/20/2022 访问量:177

问:

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

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

上面是有问题的线。有什么建议吗?

C# 范围 比较

评论

0赞 J.Salas 6/20/2022
使用自定义验证程序

答:

0赞 D Stanley 6/20/2022 #1

您不能使用属性执行此操作。属性必须使用常量值。您可以验证方法中的数据,也可以只使用最小值(因为这似乎是一个常量。

0赞 Serg 6/20/2022 #2

您不能用于此任务,因为它仅适用于 min/max 的常量值。RangeAttribute

但是,您可以为此任务创建自定义验证属性。类似的东西

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

在这里,我们从构造函数中隐藏该值,并在内部将其设置为当前年份。在其他方面,我们的新属性正常工作。maximumRangeAttribute

这里的问题是,在创建属性实例时已修复。因此,如果您在 12 月 31 日启动一个程序,那么在运行 24 小时后您将遇到问题,因为实际年份会更改,但您不会。maximimummaximum

不幸的是,属性不是虚拟的,因此您无法覆盖它。MaximumRangeAttribute

这个问题可以通过自定义归因来解决,它不是从 中固有的,而是从 中固有的。然后,您可以重新实现 (此处提供的源代码) 的逻辑。您可以抛弃大部分引用实现,只为 实现所有逻辑。RangeAttributeValidationAttributeRangeAttributeint