Использование System.DateTime в лямбда-выражении C # дает исключение - PullRequest
2 голосов
/ 19 ноября 2011

Я попытался реализовать предложение, которое возникло в другом вопросе: Вопрос Stackoverflow

Фрагмент здесь:

 public static class StatusExtensions
    {
        public static IHtmlString StatusBox<TModel>(
            this HtmlHelper<TModel> helper,
            Expression<Func<TModel, RowInfo>> ex
        )
        {
            var createdEx =
                Expression.Lambda<Func<TModel, DateTime>>(
                    Expression.Property(ex.Body, "Created"),
                    ex.Parameters
                );
            var modifiedEx =
                Expression.Lambda<Func<TModel, DateTime>>(
                    Expression.Property(ex.Body, "Modified"),
                    ex.Parameters
                );
            var a = "a" + helper.HiddenFor(createdEx) +
                helper.HiddenFor(modifiedEx);
            return new HtmlString(
                "Some things here ..." +
                helper.HiddenFor(createdEx) +
                helper.HiddenFor(modifiedEx)
            );
        }
    }

При реализации я получаю следующее исключение, которое я не совсем понимаю. Исключение указывает на строку, начинающуюся с "var creationEx ="

System.ArgumentException was unhandled by user code
  Message=Expression of type 'System.Nullable`1[System.DateTime]' cannot be used for return type 'System.DateTime'
  Source=System.Core
  StackTrace:

Может кто-нибудь помочь мне и предложить, что я мог бы сделать, чтобы разрешить исключение?

Ответы [ 2 ]

2 голосов
/ 19 ноября 2011

Сокращение добавления знака вопроса после типа допускает Nullable. Возможно, вы захотите изменить это в обеих подписях здесь. Имейте в виду, что это дает вам возможность передавать нулевые значения DateTime в качестве скрытых параметров, что может не соответствовать вашим ожиданиям. Вместо этого вы можете захотеть сохранить этот код и убедиться, что вместо него передается только ненулевое значение DateTime.

 public static class StatusExtensions
    {
        public static IHtmlString StatusBox<TModel>(
            this HtmlHelper<TModel> helper,
            Expression<Func<TModel, RowInfo>> ex
        )
        {
            var createdEx =
                Expression.Lambda<Func<TModel, DateTime?>>(
                    Expression.Property(ex.Body, "Created"),
                    ex.Parameters
                );
            var modifiedEx =
                Expression.Lambda<Func<TModel, DateTime?>>(
                    Expression.Property(ex.Body, "Modified"),
                    ex.Parameters
                );
            var a = "a" + helper.HiddenFor(createdEx) +
                helper.HiddenFor(modifiedEx);
            return new HtmlString(
                "Some things here ..." +
                helper.HiddenFor(createdEx) +
                helper.HiddenFor(modifiedEx)
            );
        }
    }
0 голосов
/ 19 ноября 2011

разрешить лямбде возвращать пустое время и дату, добавив знак вопроса: var createdEx = Expression.Lambda<Func<TModel, DateTime?>>...

...