我已经从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”,这是不正确的。
答案 0 :(得分:1)
所以我找到了一个解决方法。我发现其他一些StackOverflow答案建议使用反射来访问非公共成员。
此代码允许我访问我正在寻找的字符串。
PropertyInfo pInfo = dtr.GetType()
.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance)
.Single(x => x.Name == "CurrentDataTable");
pInfo.GetValue(dtr, null).ToString();
虽然这在技术上是有效的,但感觉就像是一种非常火腿的方式来完成看似微不足道的事情。
当然有更好的方法吗?