Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将扩展方法应用于datarow列?_C#_Extension Methods_Datarow - Fatal编程技术网

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");