我有一个在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的计数为零。 如果这是不可能的,那么请你帮我解释看看窗口如何显示这个。我可以在观察窗口添加我所看到的图像吗? 我添加了调试器显示的图像,它是如何获取此表信息的
答案 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
作为参数,而不是此特定于实现的类。