我有一个填充了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()
我在这里缺少什么?
答案 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);
}
}