2013-08-28 5 views
0

У меня есть следующий метод:передавая строку в качестве имени переменной

string fieldName = "dateAdded"; 

public void assignData(IEnumerable<object> enumerable) { 
    foreach (dynamic customData in enumerable) { 
    try { 

     // what I need: if(customData.[fieldName] == DateTime.Now) 
     if(customData.dateAdded == DateTime.Now) 
      customData.dateAdded = newValue; 
     } 

    } catch { 

    } 
    } 
} 

Мне нужно передать имя поля и проверьте, соответствует ли это DateTime.Now. Как я могу это сделать? Благодаря!

+0

где вы могли бы передать имя поля в своем методе? Это поле ** ** или ** свойство **? –

+0

Это похоже на странное место для динамического использования, почему ваш IEnumerable возвращает «объект» вместо класса или интерфейса. Кроме того, захват исключения и выполнение ничего похоже на плохую практику кодирования, я бы реорганизовал это, если это было возможно. –

+0

Что делает 'customData'? –

ответ

1

Вы должны использовать отражение для этого:

var value = customData.GetType().GetField(fieldName).GetValue(customData); 

if (value as DateTime? == DateTime.Now) 
{ 
    //... 

Вам может понадобиться использовать GetProperty вместо GetField, если это на самом деле это свойство, а не поле. Вероятно, вы также захотите проверить, что поле/свойство существует, прежде чем обращаться к нему.

Конечно, если это возможно, вы не должны полагаться на это. Было бы лучше, если вместо того, переходящая в IEnumerable<object> вы могли бы использовать такую ​​функцию, как это:

public void assignData<TSource>(IEnumerable<TSource> enumerable 
    , Func<TSource, DateTime> getter, Action<TSource, DateTime> setter) 
{ 
    foreach (var item in enumerable) 
    { 
     if (getter(item) == DateTime.Now) 
      setter(item, newvalue); 
    } 
} 

Затем абонент может просто обеспечить функцию, необходимую для получения/установки значения. Его можно было бы назвать так:

assignData(list, item => item.dateAdded 
    , (item, newDate) => item.dateAdded = newDate); 
+1

Я думаю, что 'fieldName' также' public', иначе он терпит неудачу. –

+0

@KingKing Конечно. Если вам нужно посмотреть частные значения, вы можете добавить соответствующий параметр в 'GetField'. Надеюсь, это не нужно. – Servy

+0

@Servy вы можете мне сказать, что делает?? в выражении if? – user2320462

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