c# - 创建适用于 System.Object 的扩展方法的良好做法?

标签 c# .net extension-methods data-access

我想知道我是否应该创建适用于对象级别的扩展方法,或者它们是否应该位于类层次结构的较低位置。我的意思是:

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/

相关文章:

c# - Textbox.Text 显示正确,但我在服务器代码上没有得到正确的日文字符

c# - SOAP Web服务/VS2010添加服务引用

c#语法问题-for循环和行尾

c# - LINQ 到 XML : Ignoring of the case of attributes

c# - 类中声明的变量的内存分配

.net - 带有.NET库的VB6

.net - 在托管 C++ 中从 BSTR 创建 System::String 对象 - 这种方式是个好主意吗?

c# - 我可以扩展 LINQ-to-SQL 支持的运算符吗?

c# - 类似于 Extension Methods Functionality - 我们可以扩展属性吗

c# - 使用 Razor 将 HtmlHelper 实例传递给另一个方法 MVC3