将字符串作为变量名称传递

时间:2013-08-28 16:00:24

标签: c# dynamic

我有以下方法:

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匹配。我怎样才能做到这一点?谢谢!

1 个答案:

答案 0 :(得分: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);