2012-01-09 2 views
0

I имеют расширение шаблонный методПолучить ссылку на объект из C# выражения

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") 
+3

Там нет такого объекта в выражении - 'x' является параметром выражения, вы должны передать в него объект типа. (Или я понимаю, чего вы хотите достичь неправильно.) – millimoose

+0

Спасибо за ваш ответ, Inerdial) –

+1

Вы действительно хотите, чтобы объект или текст 'Login' использовался для метода' AddModelError (key, errorMessage) '? Используйте 'ExpressionHelper.GetExpressionText' (встроенный в MVC), чтобы получить имя свойства из выражения лямбда. – kamranicus

ответ

1

Вы не можете добраться до самого объекта 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

Спасибо за ответ, я тоже не вижу другого пути. Я сделал это уже вчера в своем коде ^) –

0

Я полагаю, вы действительно хотите, чтобы текст «Войти», чтобы использовать, чтобы добавить новую ошибку модели к 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, если ресурс не найден, это только для иллюстрации.

+0

Спасибо за ответ, но Мне нужно сохранить мои данные об ошибках, такие как ключ ресурса и значение по умолчанию, в объект modelState и объект TModel. С выражением i передается свойство, к которому относятся данные об ошибках, которые должны быть сохранены в объекте TModel.) –

+1

Для этого вам необходимо передать фактический объект в качестве параметра. Общим является не сама ссылка на объект. – kamranicus

Смежные вопросы