如何为DataTable.Rows [i] [j]编写扩展方法?

时间:2013-12-05 17:38:44

标签: c# datatable extension-methods tostring datarow

我想创建一个像下面这样实现的扩展方法(如果可能的话),它类似于.ToString()扩展方法。有人可以指出我正确的方向。我试图在谷歌搜索它,找不到任何东西。

DataTable table = db.GetInfo(UserId);
if (table.Rows.Count > 0)
{
     bool b = table.Rows[0]["ColumnName"].MyExtensionMethod();
}

我基本上想简化这个:

bool b = Convert.IsDBNull(table.Rows[0]["ColumnName"]) ? false : bool.Parse(table.Rows[0]["ColumnName"].ToString());

bool b = table.Rows[0]["ColumnName"].DbBoolNullable();

5 个答案:

答案 0 :(得分:1)

由于indexer of DataRow返回System.Object,您最好的选择如下:

public static class Extensions
{
    public static bool DbBoolNullable(this object o)
    {
        return Convert.IsDBNull(o) ? false : bool.Parse(o.ToString());
    }
}

然而,我强烈反对这个,因为这是System.Object的扩展方法(.NET中的每个类继承自),然后此方法将适用于每个变量

更好的方法可能是为DataRow制作扩展方法:

public static bool GetBool(this DataRow row, string column)
{
   return Convert.IsDbNull(row[column]) ? false : bool.Parse(row[column].ToString());
}

然后你可以像这样使用它:

bool val = table.Rows[0].GetBool("ColumnName");

答案 1 :(得分:0)

你可以做点什么,

public static bool DbBoolNullable(this object cell)
{
    return Convert.IsDBNull(cell) ? false : bool.Parse(cell.ToString());
}

答案 2 :(得分:0)

这:table.Rows[0]["ColumnName"]返回对象

如果您为对象编写扩展方法,.Net中的每个类都将获得扩展名。尝试其他的东西。

答案 3 :(得分:0)

我认为您最好在DataRow级别,甚至是DataTable而不是object编写扩展方法。首先,你要避免污染object,它会让你跳过一些丑陋的语法。

所以而不是:

table.Rows[0]["ColumnName"].DbBoolNullable()

你可以在桌子上进行扩展,最后得到:

table.DbBoolNullable(0, "ColumnName")

public static bool DbBoolNullable(this DataTable table, int rowNum, string colName)
{
    return Convert.IsDBNull(table.Rows[rowNum][colName])
        ? false 
        : bool.Parse(table.Rows[rowNum][colName].ToString());
}

或者在行中进行,最后得到:

table.Rows[0].DbBoolNullable("ColumnName")

public static bool DbBoolNullable(this DataRow row, string colName)
{
    return Convert.IsDBNull(row[colName])
        ? false 
        : bool.Parse(row[colName].ToString());
}

答案 4 :(得分:0)

在这里看看我的答案:https://stackoverflow.com/a/5599559/467473 - 前段时间,我写了一堆扩展方法来做你想做的事情。要扩展此技术,您需要查看the documentation on type mapping between C# and SQL Server

此外,如果您使用.Net CLR的近期版本,请查看System.Data.DataRowExtensions,这可能只是您正在寻找的东西。