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

4

1 回答 1

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);
于 2013-08-28T16:04:51.353 回答