【发布时间】:2011-08-31 13:25:56
【问题描述】:
我需要一种方法来从 IDataRecord 中检索数据,而无需使用烦人的“魔术字符串”来表示字段名称。 经过一番研究,我想出了这个扩展方法:
public static T2 ReadValue<T1, T2>(this IDataRecord record, Expression<Func<T1, T2>> expression)
{
MemberExpression body = (MemberExpression)expression.Body;
string fieldName = body.Member.Name;
int ordinal = record.GetOrdinal(fieldName);
return (T2)(record.IsDBNull(ordinal) ? default(T2) : record.GetValue(ordinal));
}
然后我就这样使用这个方法:
product.Name = record.ReadValue<Product, string>(p => p.Name);
还有其他方法可以简化这种方法吗?我喜欢这种行为,但不喜欢这种风格! :)
非常感谢你!
【问题讨论】:
-
这个问题更适合Code Review。
-
对不起,我不知道代码审查。你能移动我的问题吗?
-
我不认为隐藏你正在使用魔术字符串的事实,同时仍然使用魔术字符串,是对使用魔术字符串的改进。
-
我在这里看不到任何魔术字符串。所有表达式完全支持重构。我错过了什么吗?
-
没关系,我看错了。
标签: generics lambda c#-3.0 extension-methods