将字符串作为变量名称传递
本文关键字:变量名 字符串 | 更新日期: 2023-09-27 18:29:17
>我有以下方法:
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 匹配。我该怎么做?谢谢!
您需要为此使用反射:
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);