无法从DataTableReader对象获取表的名称

时间:2015-11-09 23:57:20

标签: c# .net datatable

我已经从XML文件创建了一个DataSet对象。

DataSet ds = new DataSet();
using (StreamReader sr = new StreamReader(file))
{
    XmlTextReader xmltext = new XmlTextReader(sr);
    ds = new DataSet();
    ds.ReadXml(xmltext);
}

然后我创建一个DataTableReader对象并开始遍历每个表和每一行。

using (DataTableReader dtr = ds.CreateDataReader())
{
    while (dtr.NextResult())  // foreach table
    {
        // would like to access table name here

        while (dtr.Read())   // foreach row
        {
             ....

我的问题是我想访问DataTableReader中每个表的名称,但似乎没有可供我使用的属性。

如果我检查DataTableReader对象,我看到表名存储在一个名为“CurrentDataTable”的属性中,但这是一个非公共成员,我无法访问它。

我还尝试在DataTableReader上使用'GetSchemaTable'函数,它返回一个DataTable对象。这看起来很有希望,但DataTable对象的'TableName'属性的值为“SchemaTable”,这是不正确的。

1 个答案:

答案 0 :(得分:1)

所以我找到了一个解决方法。我发现其他一些StackOverflow答案建议使用反射来访问非公共成员。

此代码允许我访问我正在寻找的字符串。

PropertyInfo pInfo = dtr.GetType()
     .GetProperties(BindingFlags.NonPublic | BindingFlags.Instance)
     .Single(x => x.Name == "CurrentDataTable");

pInfo.GetValue(dtr, null).ToString();

虽然这在技术上是有效的,但感觉就像是一种非常火腿的方式来完成看似微不足道的事情。

当然有更好的方法吗?