2013-08-28 42 views
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。我怎样才能做到这一点?谢谢!

+0

在哪里可以在您的方法中传递字段名称?它是**字段**还是**属性**? –

+0

这似乎是一个奇怪的地方使用动态,为什么你的IEnumerable返回'对象'而不是类或接口。此外,捕获异常和无所事事看起来像不好的编码习惯,如果可能的话,我会重构这个。 –

+0

'customData'拥有什么? –

回答

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); 
+1

我猜'fieldName'也是'public',否则失败。 –

+0

@KingKing当然。如果您需要查看私有值,则可以将相应的参数添加到“GetField”中。但希望这不是必需的。 – Servy

+0

@Servy你能告诉我''是什么吗?在if语句中意味着什么? – user2320462

相关问题