从EnumerableRowCollection(Of System.Data.DataRow)中,将表分配给变量

时间:2015-11-30 21:51:39

标签: .net vb.net linq system.data

我有一个在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}

我可以追踪

如果我尝试     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))

总之,我希望能够从EnumerableRowCollection(Of System.Data.DataRow)访问数据表,即使EnumerableRows的计数为零。 如果这是不可能的,那么请你帮我解释看看窗口如何显示这个。我可以在观察窗口添加我所看到的图像吗? 我添加了调试器显示的图像,它是如何获取此表信息的 enter image description here

1 个答案:

答案 0 :(得分:0)

没有公开属性或方法公开基础DataTable。您在Table媒体资源中看到的internal媒体资源无法公开访问。您可以使用反射

来深入了解此实现细节
var pi = rows.GetType().GetProperty("Table",BindingFlags.NonPublic | BindingFlags.Instance);
DataTable dt = pi.GetValue(rows) as DataTable;

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

由于课程本身is not intended to be used directly from your class,我强烈建议您更改您的方法,以DataTable作为参数,而不是此特定于实现的类。