Получить ссылку на объект из выражения c # - PullRequest
0 голосов
/ 09 января 2012

У меня есть расширение универсального метода

public static void AddError<TModel>(
    this ModelStateDictionary modelState, 
    Expression<Func<TModel, object>> expression, 
    string resourceKey, 
    string defaultValue)
{
    // How can I get a reference to TModel object from expression here?
}

Мне нужно получить ссылку на объект TModel из выражения. Этот метод вызывается с помощью следующего кода:

ModelState.AddError<AccountLogOnModel>(
    x => x.Login, "resourceKey", "defaultValue")

Ответы [ 2 ]

1 голос
/ 10 января 2012

Вы не можете добраться до самого объекта TModel, не передав его в метод.Выражение, которое вы передаете, говорит только «взять это свойство из TModel».На самом деле он не предоставляет TModel для работы.Итак, я бы изменил код на что-то вроде этого:

public static void AddError<TModel>(
    this ModelStateDictionary modelState, 
    TModel item,
    Expression<Func<TModel, object>> expression, 
    string resourceKey, 
    string defaultValue)
{
    // TModel's instance is accessible through `item`.
}

Тогда ваш код вызова будет выглядеть примерно так:

ModelState.AddError<AccountLogOnModel>(
    currentAccountLogOnModel, x => x.Login, "resourceKey", "defaultValue")
0 голосов
/ 09 января 2012

Полагаю, вы действительно хотите, чтобы текст "Логин" использовался для добавления новой ошибки модели в ModelStateDictionary.

public static void AddError<TModel>(this ModelStateDictionary modelState, 
  Expression<Func<TModel, object>> expression, string resourceKey, string defaultValue)
{
    var propName = ExpressionHelper.GetExpressionText(expression);

    modelState.AddModelError(propName, GetResource("resourceKey") ?? defaultValue);
}

Предположим, у вас есть фабрика / метод ресурсов, который возвращает null, если ресурс не найден, это просто для иллюстрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...