Разбор Datetime из строки без ошибок - PullRequest
2 голосов
/ 25 июля 2011

Я новичок в C #, поэтому вполне возможно, что это довольно простое решение, но я не нашел ничего, что я бы посчитал элегантным. Если вам нужна какая-либо дополнительная информация или вы не знаете, о чем я спрашиваю, сообщите мне, и я свяжусь с вами, как только смогу.

В настоящее время существует способ создания правил проверки (для случаев, когда кто-то отправляет форму), например так:

new ValidationRuleInstance<DetailsPresenter>(
    new IsValidDateRule<DetailsPresenter>(m => m.StartDate, "StartDate"),
    new ValidationRuleInterpretation(Severity.Failure, "StartDateMustBeValid", "Must enter valid start date (dd/mm/yyyy)")
),

То, что я пытаюсь сделать, - это создать правило проверки, чтобы проверить, произошла ли дата, которую мне дали, в прошлом. Я устал от этого:

new ValidationRuleInstance<DetailsPresenter>(
    new FailIfTrueRule<DetailsPresenter>(m => (DateTime.Parse(m.StartDate).AddDays(1) < DateTime.Now) ,"StartDate"),
    new ValidationRuleInterpretation(Severity.Failure, "StartDateCannotBeInThePast", "Your start date cannot be in the past")
),

Это работает ... Большую часть времени (P.S. я добавляю один день, чтобы ввод текущей даты не вызывал ошибку).

Проблема в том, что, если кто-то отправляет строку, которую нельзя проанализировать в объекте даты и времени (например, 725/2011 вместо 25.07.2011), все это взорвется.

Я попытался использовать TryParse, однако он возвращает логическое значение, а не объект Time-Date.

Я собираюсь написать собственный метод для анализа String и всегда возвращать объект DateTime? Могу ли я поймать исключение и проигнорировать его? (уже существует отдельное правило для проверки правильности строки)

Ответы [ 2 ]

5 голосов
/ 25 июля 2011

Нет причин, по которым вы не можете использовать многострочный блок кода в лямбде. Вам просто нужно заключить код в скобки и выполнить явные операторы return, а не просто указать одно выражение, которое неявно возвращает его значение.

new ValidationRuleInstance<DetailsPresenter>(
    new FailIfTrueRule<DetailsPresenter>(m => 
{
    DateTime value;

    if(DateTime.TryParse(m.StartDate, out value))
    {
        return value.AddDays(1) < DateTime.Now;
    }
    else // parsing failed, return whatever value is appropriate
    {

    }
} ,"StartDate"),
    new ValidationRuleInterpretation(Severity.Failure, "StartDateCannotBeInThePast", "Your start date cannot be in the past")
),
3 голосов
/ 25 июля 2011

Вы должны написать лямбду следующим образом:

m => { DateTime d; return DateTime.TryParse(m.StartDate, out d) ? d.AddDays(1) < DateTime.Now : true; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...