C# 如何将扩展方法应用于datarow列?
我有一个填充了C# 如何将扩展方法应用于datarow列?,c#,extension-methods,datarow,C#,Extension Methods,Datarow,我有一个填充了ints的数据行,存储为strings。 我可以这样解析每一个:Convert.ToInt32(行[1].ToString()) 它能工作,但有点难看。我的想法是,也许我可以使用一个扩展类来尝试创建一个.ToInt方法。把事情简化了一点。经过一些研究,我写了以下内容: static class DataRowHelper { public static int ToInt(this DataRow row) { return Convert.To
int
s的数据行,存储为string
s。
我可以这样解析每一个:Convert.ToInt32(行[1].ToString())
它能工作,但有点难看。我的想法是,也许我可以使用一个扩展类来尝试创建一个.ToInt
方法。把事情简化了一点。经过一些研究,我写了以下内容:
static class DataRowHelper
{
public static int ToInt(this DataRow row)
{
return Convert.ToInt32( row.ToString());
}
}
这几乎让我达到了目的,但问题是它将新方法像这样附加到行:row.ToInt()
,而不是像这样附加它:row[1].ToInt()
这里缺少什么?您的扩展方法应该继承
字符串,而不是数据行。它应该是这样的(请记住这非常简单……您可能应该包括某种类型的错误处理):
如果要处理泛型和DbNull,则更好:
static class DataRowHelper
{
public static int ToInt(this object item)
{
return Convert.ToInt32(item == null ? 0 : item);
}
}
这不是非常异常安全的,并且会引发很多情况。您可能希望在此处添加一些检查,或者实现一个TryToInt()
type方法。您可以只添加列号作为参数:
int i1 = row.ToInt(1);
int i2 = row.ToInt(2);
等等
在这种情况下,扩展方法是(不包括错误处理):
我觉得其他答案提供了解决方案,但不是答案
扩展方法不起作用的原因是数据行
-行[1]
的返回类型不是数据行
,而是字符串
您应该增强扩展方法以允许使用此索引器:
public static class DataRowExtensions
{
public static int ToInt(this DataRow row, int index)
{
return Convert.ToInt32(row[index].ToString());
}
}
您不必应用自己的扩展方法来实现您在问题中描述的内容,因为MS团队已经为您编写了一个扩展方法(terrybozzio在评论中暗示了这一点)
不要使用这样的语法:
var id = Convert.ToInt32(row[1]);
var id = Convert.ToInt32(row["id"]);
有一个强类型的字段
扩展方法,允许您指定数据类型:
var id = row.Field<int>(1);
var id = row.Field<int>("id");
var id=row.Field(1);
变量id=行字段(“id”);
我无法想象,通过编写自己的扩展方法,您会变得更短或更清晰。为什么不使用强制转换呢?所以您想从整个数据行返回一个int
?您可能想尝试row.field如果您想喜欢,它真的应该是这个t项
;)这个对象项
如果你真的想全力以赴,但我为他简化了事情。只要使用对象
而不是T
-这里不需要泛型。@DStanley:你绝对可以有一个泛型静态类-只是其中不能有扩展方法。@Jonsket很好的一点-这本身就可以工作,但不是作为一种扩展方法。我是否只需要删除static
?@Pheonixblade9不,正如您可能知道的,它必须是静态的才能成为扩展方法。要么使方法泛型而不是类,要么完全删除泛型。@Pheonixblade9删除
(如Jon所说:)有趣的解决方案。这正是我想要的,而不是在扩展类中混日子。谢谢
var id = Convert.ToInt32(row[1]);
var id = Convert.ToInt32(row["id"]);
var id = row.Field<int>(1);
var id = row.Field<int>("id");