【问题标题】:How to write an extension method for DataTable.Rows[i][j]? [closed]如何为 DataTable.Rows[i][j] 编写扩展方法? [关闭]
【发布时间】:2013-12-05 17:38:44
【问题描述】:

我想创建一个类似于.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();

【问题讨论】:

  • 你的问题不清楚。
  • 那是objectToString() 不是扩展方法。
  • 我对我的问题进行了修改...我对编程比较陌生,所以如果我的问题陈述错误,请见谅。
  • 要添加到 SLaks 注释中,术语“扩展”方法是一种特定类型的方法,如果您是编程新手,则可能不需要关心。你应该只写一个“方法”。 "ToString()" 不是扩展方法。

标签: c# datatable extension-methods tostring datarow


【解决方案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");

【讨论】:

  • 第二个选项(推荐)就像一个魅力!感谢您对为什么在DataRow 级别实施更好。
【解决方案2】:

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

如果您为对象编写扩展方法,.Net 中的每个类都将获得扩展。试试别的吧。

【讨论】:

    【解决方案3】:

    你可以这样做,

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

    【讨论】:

      【解决方案4】:

      我认为最好在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());
      }
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-02-23
          • 1970-01-01
          • 2010-09-09
          • 2011-05-07
          • 2019-04-19
          • 2014-08-11
          • 1970-01-01
          相关资源
          最近更新 更多