0

我有一个在 EnumerableRowCollection(Of System.Data.DataRow) 中传递的方法,我希望能够使用底层数据表。最终我希望能够使用该数据表的列集合。

目前我使用

Dim t As System.Data.DataTable = TryCast(x(0), DataRow).Table

哪里x is EnumerableRowCollection(Of System.Data.DataRow

这很好用,除了行数为零的情况。

我确信底层数据表定义仍然存在,因为如果我针对 x '添加手表',我可以通过调试器访问它

在监视窗口中我看到

x|{System.Data.EnumerableRowCollection(of System.Data.DataRow)}
System.Data.EnumerableRowCollection(of System.Data.DataRow)|{System.Data.EnumerableRowCollection(of System.Data.DataRow)}
ElementType| {Name="DataRow" FullName = "System.Data.DataRow"}
EnumerableRows|In-Memory Query
Table|{mydatatable}

我追求的是 mydatatable

如果我尝试 x.Table 然后我得到

“表”不是“System.Collections.Generic.IEnumerable(Of System.Data.DataRow)”的成员。

在我的情况下, enumerablerowcollection 很可能是使用带有 orderby 的 LINQ 从数据表创建的

 Dim z = (From d In mydataset.mydatatable.OrderBy(Function(c) c.myfield))

总之,即使 EnumerableRows 的计数为零,我也希望能够从 EnumerableRowCollection(Of System.Data.DataRow) 访问数据表。如果这是不可能的,那么请你帮我解释一下监视窗口如何显示这个。我可以添加我在监视窗口中看到的图像吗?我添加了调试器显示的图像,它如何获取此表信息 在此处输入图像描述

4

1 回答 1

0

没有公开底层的公共属性或方法DataTable。您在不可公开访问的属性中看到Table的属性。internal可以使用反射深入研究此实现细节:

var pi = rows.GetType().GetProperty("Table",BindingFlags.NonPublic | BindingFlags.Instance);
DataTable dt = pi.GetValue(rows) as DataTable;

但是(希望很明显)这些内部实现细节很脆弱并且可能会发生变化。

由于该类本身不打算直接从您的类中使用,因此我强烈建议您更改方法以将 aDataTable作为参数而不是此特定于实现的类。

于 2015-11-30T23:50:28.183 回答