Константа DateTime в C # - PullRequest
44 голосов
/ 28 июля 2011

Я хотел бы указать постоянную дату и время в параметре атрибута. Как мне сделать постоянную дату и время? Он связан с ValidationAttribute блока приложения EntLib Validation, но также применим и к другим атрибутам.

Когда я делаю это:

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)]

Я получу:

Тип 'System.DateTime' не может быть объявлен как const

Есть идеи? Идти по этому пути не желательно:

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

Ответы [ 4 ]

34 голосов
/ 12 октября 2012

Как отмечают некоторые из предыдущих ответов, const DateTime изначально не поддерживается в C # и не может использоваться в качестве параметра атрибута.Тем не менее, readonly DateTime (который рекомендуется более const в Effective C #, 2-е издание [Элемент 2]) - это простой обходной путь для других ситуаций:

public class MyClass
{
    public static readonly DateTime DefaultDate = new DateTime(1900,1,1);
}
23 голосов
/ 28 июля 2011

Решение, о котором я всегда читал, состоит в том, чтобы либо пройти маршрут строки, либо передать день / месяц / год в виде трех отдельных параметров, поскольку C # в настоящее время не поддерживает буквальное значение DateTime.

Вот простой пример, который позволит вам передать либо три параметра типа int, либо 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;
    }
}
4 голосов
/ 28 июля 2011

DateTimeRangeValidator может принимать строковое представление (формат ISO8601) в качестве параметра

* 1003 например *

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

Один параметр будет интерпретироваться как UpperBound , поэтому вам нужно 2, если вы хотите ввести LowerBound. Проверьте документы, чтобы узнать, существует ли специальное значение 'все равно' для UpperBound или вам нужно установить его на очень далекую будущую дату.

Упс, просто перечитал и заметил

«Идти по этому пути не желательно»

[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)]

быть немного хуже / отличаться от (формат даты VB)

private const DateTime LowerBound = #01/01/2000 00:00 AM#;
private const DateTime UpperBound = #20/01/2000 11:59 PM#;

[DateTimeRangeValidator(LowerBound, UpperBound)]

чч,
Alan

0 голосов
/ 21 октября 2015

Одним из решений является разделение даты на поля дня, месяца и года, затем расширение RangeAttribute Таким образом, вы получаете все преимущества встроенной проверки.

См. Пример ниже:

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">
...