我有以下方法:
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 :(得分: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);