如何利用反思访问非公开列表及其非公共元素

时间:2014-06-27 06:03:40

标签: c# .net reflection

我需要访问数组中的列表元素以获取“Message”字符串,如下所示:

string msg0 = sender.SyncHelper.UploadSyncProgressList[0].Results.Exception.Message;
string msg1 = sender.SyncHelper.UploadSyncProgressList[1].Results.Exception.Message;
...

我获得了“sender”对象(类型为“object”)。其余的(SyncHelper,UploadSyncProgressList,Results,Exception和Message)都是非公开的。对于这些,它们的类类型也是非公共类型(“异常”除外)。

image显示问题的直观表示。

我已经设法使用反射来使用以下代码获取列表变量“UploadSyncProgressList”,但我仍然坚持如何遍历列表元素以获取“Messages”字符串:

PropertyInfo syncHelperInfo = sender.GetType().GetProperty("SyncHelper", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
object syncHelper = syncHelperInfo.GetValue(sender, null);

PropertyInfo uploadProgressSyncListInfo = syncHelper.GetType().GetProperty("UploadSyncProgressList", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
object uploadProgressSyncList = uploadProgressSyncListInfo.GetValue(syncHelper, null);

如何循环“uploadProgressSyncList”元素以获取“消息”字符串?

我这样做是因为我需要访问隐藏在第三方库中的低级网络错误消息。

提前致谢!

1 个答案:

答案 0 :(得分:1)

这里你没什么选择。

因为UploadSyncProgressList是List<ESRI...EventArgs>的类型,它实现了以下集合接口

<强>通用

  • IList<T>
  • IEnumerable<T>
  • ICollection<T>
  • IReadOnlyList<T>
  • IReadOnlyCollection<T>

非通用

  • IEnumerable
  • ICollection
  • IList

因此,如果上下文中的EventArgs是公共的,那么您可以将结果uploadProgressSyncList转换为任何通用接口

例如

IList<ESRI...EventArgs> syncList = (IList<ESRI...EventArgs>)uploadProgressSyncList;

您可以使用上面适合您需要的任何通用界面

如果事件arg类型不公开,那么非通用是您的选择

IList syncList = (IList)uploadProgressSyncList;

使用IList IList<T>IReadOnlyList<T>界面将帮助您通过索引进行检索

例如

var arg1 = syncList[0];

对于以上所有内容,您可以使用foreach

进行迭代

例如

foreach(var arg in syncList)
{
    //your logic with arg
}