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 に答える