如何将扩展方法应用于数据行列?

时间:2014-07-02 21:12:12

标签: c# extension-methods datarow

我有一个填充了int的数据行,存储为string s。 我可以像这样解析每一个:Convert.ToInt32(row[1].ToString())

它有效,但有点不雅观。我有一个想法,也许我可以使用扩展类来尝试制作.ToInt方法。稍微简化一下。经过一番研究,我写了这个:

static class DataRowHelper
{
    public static int ToInt(this DataRow row)
    {
          return Convert.ToInt32( row.ToString());   
    }
}

这几乎让我在那里,但问题是它将新方法附加到这样的行:row.ToInt()而不是像这样附加它:row[1].ToInt()

我在这里缺少什么?

5 个答案:

答案 0 :(得分:3)

我觉得其他答案都是提供解决方案,但不是答案

原因您的扩展方法无效是因为DataRow - row[1]的{​​{3}}的返回类型不是{{ 1}},它是DataRow

您应该增强扩展方法以允许此索引器:

string

答案 1 :(得分:2)

您不必应用自己的扩展方法来实现您在问题中描述的内容,因为MS团队已经为您编写了一个(terrybozzio在评论中暗示了它)

而不是使用这样的语法:

var id = Convert.ToInt32(row[1]);

var id = Convert.ToInt32(row["id"]);

有一种强类型Field扩展方法,允许您指定数据类型:

var id = row.Field<int>(1);

var id = row.Field<int>("id");

我无法想象通过编写自己的扩展方法,你会比这更短或更清楚。

答案 2 :(得分:1)

您只需将列号添加为参数:

int i1 = row.ToInt(1);
int i2 = row.ToInt(2);

在这种情况下,扩展方法是(不包括错误处理):

public static int ToInt(this DataRow row, int column)
{
      return Convert.ToInt32(row[column].ToString());   
}

答案 3 :(得分:0)

如果你想处理泛型和DbNull,那就更好了:

static class DataRowHelper
{
    public static int ToInt(this object item)
    {
        return Convert.ToInt32(item == null ? 0 : item);
    }
}

这不是非常安全的,并且会抛出很多条件。您可能希望在此处添加一些检查,或实现TryToInt()类型方法。

答案 4 :(得分:-2)

您的扩展方法应该继承string,而不是DataRow。它应该看起来像这样(请记住这很简单......你应该包括某种错误处理):

static class DataRowHelper
{
    public static int ToInt(this string item)
    {
          return Convert.ToInt32(item);   
    }
}