在C#中的常量DateTime

我想把一个常量date时间放在一个属性参数中,我如何使一个常量date时间? 它与EntLibvalidation应用程序块的ValidationAttribute有关,但也适用于其他属性。

当我这样做:

 private DateTime _lowerbound = new DateTime(2011, 1, 1); [DateTimeRangeValidator(_lowerbound)] 

我去拿:

 An object reference is required for the non-static field, method, or property _lowerbound 

并通过这样做

 private const DateTime _lowerbound = new DateTime(2011, 1, 1); [DateTimeRangeValidator(_lowerbound)] 

我去拿:

types“System.DateTime”不能被声明为const

有任何想法吗? 这样做是不可取的:

 [DateTimeRangeValidator("01-01-2011")] 

我一直在阅读的解决scheme是去一个string的路由,或作为三个单独的parameter passing在日/月/年,因为C#目前不支持DateTime文本值。

下面是一个简单的例子,它可以让你传入三个inttypes的参数或一个string到属性中:

 public class SomeDateTimeAttribute : Attribute { private DateTime _date; public SomeDateTimeAttribute(int year, int month, int day) { _date = new DateTime(year, month, day); } public SomeDateTimeAttribute(string date) { _date = DateTime.Parse(date); } public DateTime Date { get { return _date; } } public bool IsAfterToday() { return this.Date > DateTime.Today; } } 

正如前面的一些回应所指出的那样,一个const DateTime在C#中不是本地支持的,并且不能用作属性参数。 尽pipe如此, readonly DateTime (在Effective C#第2版[项目2]中推荐使用const )对于其他情况是一个简单的解决方法,如下所示:

 public class MyClass { public static readonly DateTime DefaultDate = new DateTime(1900,1,1); } 

DateTimeRangeValidator可以采用string表示forms(ISO8601格式)作为参数

例如

  LowerBound UpperBound [DateTimeRangeValidator("2010-01-01T00:00:00", "2010-01-20T00:00:00")] 

单个参数将被解释为UpperBound,所以如果你想inputLowerBound ,你需要2。 检查文档以查看UpperBound是否存在特殊的“无关”值,或者是否需要将其设置为非常遥远的未来date。

哎呀,只是重新阅读和注意

“这样做是不可取的”

 [DateTimeRangeValidator("01-01-2011")] 

为什么不?

 private const string LowerBound = "2010-01-01T00:00:00"; private const string UpperBound = "2010-01-20T00:00:00"; [DateTimeRangeValidator(LowerBound, UpperBound)] 

比(VBdate文字格式)更差/不同

 private const DateTime LowerBound = #01/01/2000 00:00 AM#; private const DateTime UpperBound = #20/01/2000 11:59 PM#; [DateTimeRangeValidator(LowerBound, UpperBound)] 

心连心,
艾伦

一种解决scheme是将date分为日,月和年的字段,然后扩展RangeAttribute这样你就可以获得内置validation的所有好处。

看下面的例子:

 public class PermittedYearRangeAttribute : RangeAttribute { public PermittedYearRangeAttribute() : base(1900, DateTime.Now.AddYears(-50).Year) { ErrorMessage = string.Format("Year must be between 1900 and {0}", DateTime.Now.AddYears(-50).Year); } } 

Global.asax.cs Application_Start()方法中添加下面一行

 DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(PermittedYearRangeAttribute), typeof(RangeAttributeAdapter)); 

在模型装饰属性中:

  [Required(ErrorMessage = "Please enter year")] [PermittedYearRange] public int Year { get; set; } [Required(ErrorMessage = "Please enter day")] [Range(1, 31, ErrorMessage = "Day must be between 1 and 31")] public int Day { get; set; } [Required(ErrorMessage = "Please enter month")] [Range(1, 31, ErrorMessage = "Month must be between 1 and 12")] public int Month { get; set; } 

Html呈现:

  <input class="tooltip form-control input dob--input input-validation-error" data-val="true" data-val-number="The field Year must be a number." data-val-range="Year must be between 1900 and 1965" data-val-range-max="1965" data-val-range-min="1900" data-val-required="Please enter year" id="Year" maxlength="4096" name="Year" placeholder="YYYY" tabindex="" type="text" value="0">