2016-12-21 3 views
1

У меня есть это, который работает отлично:Использование переменной в качестве имени динамического свойства

private void BindFilter(DropDownList ddl, IEnumerable<dynamic> items) 
{ 
    ddl.Items.Clear(); 
    foreach (var item in items) 
    { 
     ddl.Items.Add(item.bodystyle.ToString()); 
    } 
} 

Я знаю Bodystyle это свойство по пункту.

Можно ли хотя сделать это, передавая строку в качестве переменной, например:

private void BindFilter(DropDownList ddl, string field, IEnumerable<dynamic> items) 
{ 
    ddl.Items.Clear(); 
    foreach (var item in items) 
    { 
     ddl.Items.Add(item.{field}.ToString()); 
    } 
} 

ответ

2

Вы можете добиться того, что с помощью отражения:

private void BindFilter(DropDownList ddl, string field, IEnumerable<dynamic> items) 
{ 
    ddl.Items.Clear(); 
    foreach (var item in items) 
    { 
     var propertyInfo = item.GetType().GetProperty(field); 
     var value = propertyInfo.GetValue(item, null); 
     ddl.Items.Add(value.ToString()); 
    } 
} 
+0

Эта строка - var value = propertyInfo.GetValue (item, null); fail с RuntimeBinderException - Не удается выполнить привязку времени выполнения по нулевой ссылке. Благодарю. – Ben

0

без использования отражения:

private void BindFilter(DropDownList ddl, Func<dynamic, string> getStringAction, IEnumerable<dynamic> items) 
    { 
     ddl.Items.Clear(); 
     foreach (var item in items) 
     { 
      ddl.Items.Add(getStringAction(item)); 
     } 
    } 

Вы называете это так:

BindFilter(ddl, item => item.Field.ToString(), items); 
Смежные вопросы