加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:24:02 所属栏目:百科 来源:网络整理
导读:我想知道是否应该创建适用于对象级别的扩展方法,或者是否应该位于类层次结构中的较低点.我的意思是: public static string SafeToString(this Object o) { if (o == null || o is System.DBNull) return ""; else { if (o is string) return (string)o; els
我想知道是否应该创建适用于对象级别的扩展方法,或者是否应该位于类层次结构中的较低点.我的意思是:
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

我写了这些方法,因为我必须处理很多数据库数据(从OleDbDataReader),可以是null(不应该,但是),因为底层数据库是非常宽松的列可能是null.为了让我的生活更容易一些,我想出了这些扩展方法.

我想知道的是,这是否是好的风格,可接受的风格或坏的风格.我有点担心,因为它有点“污染”对象类.

谢谢你提前&最好的祝福 :)

基督教

附:我没有故意把它标记为“主观”.

解决方法

不,这不是很好的做法.你想在最低的可能点应用扩展方法.我相信有一个时间和一个地方(几乎)一切,但扩展方法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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读