我想知道我是否应该创建适用于对象级别的扩展方法,或者它们是否应该位于类层次结构的较低位置。我的意思是:
public static string SafeToString(this Object o) {
if (o == null || o is System.DBNull)
return "";
else {
if (o is string)
return (string)o;
else
return "";
}
}
public static int SafeToInt(this Object o) {
if (o == null || o is System.DBNull)
return 0;
else {
if (o.IsNumeric())
return Convert.ToInt32(o);
else
return 0;
}
}
//same for double.. etc
我编写这些方法是因为我必须处理很多可能为 null 的数据库数据(来自 OleDbDataReader)(尽管不应该),因为不幸的是底层数据库非常对列很自由那可能是空的。为了让我的生活更轻松一些,我想出了这些扩展方法。
我想知道这是好的风格、可接受的风格还是坏的风格。我有点担心它,因为它有点“污染”了 Object 类。
提前致谢并致以最诚挚的问候:)
基督徒
附言我没有故意将其标记为“主观”。
最佳答案
不,这不是好的做法。您希望在最低点 应用扩展方法。我相信(几乎)所有事情都有时间和地点,但扩展方法 System.Object 几乎永远不合适。您应该能够在继承堆栈的更下方应用诸如此类的扩展方法。否则它会使您的智能感知变得困惑,并可能最终被其他开发人员错误地使用/依赖。
但是,用于处理 Null 值的数据对象的扩展方法是扩展方法的非常好的用途。考虑将它们放在您的 OleDbDataReader 上。我有一个名为 ValueOrDefault 的通用扩展方法。 . .好吧,我会展示给你看:
<Extension()> _
Public Function ValueOrDefault(Of T)(ByVal r As DataRow, ByVal fieldName As String) As T
If r.IsNull(fieldName) Then
If GetType(T) Is GetType(String) Then
Return CType(CType("", Object), T)
Else
Return Nothing
End If
Else
Return CType(r.Item(fieldName), T)
End If
End Function
那是 VB,但你明白了。这个笨蛋为我节省了大量时间,并且在读取数据行时真正使代码变得干净。 你走在正确的轨道上,但你的法术感是正确的:你的扩展方法太高了。
将扩展方法放入单独的命名空间总比没有好(这是对命名空间的完全有效使用;Linq 使用它),但您不必这样做。要使这些方法应用于各种数据库对象,请将扩展方法应用于 IDataRecord。
关于c# - 创建适用于 System.Object 的扩展方法的良好做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2417481/