我想创建一个像下面这样实现的扩展方法(如果可能的话),它类似于.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();
答案 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,这可能只是您正在寻找的东西。