2010-07-14 3 views
3

я использую следующий метод для создания объекта SelectListItem из любого другого объекта:Как получить полное имя свойства от лямбда

public static SelectListItem ToSelectListItem<T, TResult, TResult2>(T obj, Expression<Func<T, TResult>> value, Expression<Func<T, TResult2>> text) 
{ 
    string strValue = String.Empty; 
    string strText = String.Empty; 

    if (value != null) 
      strValue = (value.Body as MemberExpression).Member.Name; 

    if (text != null) 
      strText = (text.Body as MemberExpression).Member.Name; 
     ... 
} 

Я использую этот метод, как это:

SelectListItem item = ToSelectListItem(obj, x => x.ID, x => x.Name); 

И он отлично работает. Однако, когда я определяю свойство из соответствующего объекта все, что я получаю имя свойства

SelectListItem item = ToSelectListItem(obj, x => x.ID, x => x.Profile.Name); 

имя свойства я могу получить от «х => x.Profile.Name» только ' Имя », и я действительно хотел получить« Profile.Name ».

Любые предложения будут оценены.

+0

Возможный дубликат [C#: Получение имен свойств в цепочке из выражения лямбда] (http://stackoverflow.com/questions/1667408/c-getting-names-of-properties- in-a-chain-from-lambda-expression) – nawfal

ответ

2

Или вы можете использовать

expression.Compile().Invoke(obj) 

, если вы хотите использовать Expression<>

2

Это разместить детали ясно, как достичь этого: http://geekswithblogs.net/EltonStoneman/archive/2009/11/05/retrieving-nested-properties-from-lambda-expressions.aspx

+1

... и для хорошего смеха обратите внимание на комментарий ниже сообщения: «это PHP?» – Jay

+0

Это сообщение помогло мне найти лучшее решение – Raphael

0

Это гораздо проще в использовании Func вместо выражения <>

Чтобы управлять собственностью все, что нужно сделать, это вызвать его:

expression.Invoke(obj); 
Смежные вопросы