通过引用获取 Collections.Generic 的元素

本文关键字:Generic 元素 Collections 获取 引用 | 更新日期: 2023-09-27 18:31:42

我目前正在研究一个类,该类提供了指向根对象的链接,并获取该类指向的所有内容,然后创建一个打印输出,以便可以对其进行过滤,并搜索以查找诸如空指针之类的内容,以及引用同一对象的多个内容。

我已经能够通过使用 LINQ 和反射来完成其中的大部分工作,除了能够查看列表或字典的元素。

使用反射,我可以得到它是typeof(List<"someClass">),或typeof(Dictionary<"someOtherClass">)。 这个问题可能听起来微不足道(因为列表包含的类型应该是已知的),但是在当前基准测试程序中的许多地方,都有任意数量的列表和字典,它们可能包含程序集中的几乎任何类对象。

问题是:我将如何从存储的 FieldInfo 中去,我可以测试它找到它具有这些集合之一的类型.Generic 然后使用反射获取集合的元素,以便我可以获取元素的 FieldInfo?

编辑代码

// behave is a pointer to a System.object
// infoList is a List<fieldInfo> that belong to behave
string DisplayFields(){
    string _str = "";
    List<FieldInfo> _newList = infoList; 
    if(_newList != null && _newList.count > 0){
        foreach(FieldInfo info in _newList){
            if(info.FieldType.ToString().Contains(".List")){
                _str += "'t" + info.Name;
                _str += ".typeof(" + info.FieldType + "): ";
                _str += ((info.GetValue(behave)!=null)?info.GetValue(behave):"null");
                _str += "'n";
                // this is where the work on List should happen
            }else if(info.FieldType.ToString().Contains(".Dictionary")){
                _str += "'t" + info.Name;
                _str += ".typeof(" + info.FieldType + "): ";
                _str += ((info.GetValue(behave)!=null)?info.GetValue(behave):"null");
                _str += "'n";
                // this is where the work on Dictionary should happen
            }else if(info.FieldType.ToString().Contains("String")){
                _str += "'t" + info.Name;
                _str += ".typeof(" + info.FieldType + "): ";
                _str += ((info.GetValue(behave)!=null)?info.GetValue(behave):"null");
                _str += "'n";
            }else{
                _str += "'t" + info.Name;
                _str += ".typeof(" + info.FieldType + "): ";
                _str += ((info.GetValue(behave)!=null)?info.GetValue(behave):"null");
                _str += "'n";
            }
        }
    }
    return _str;
}

通过引用获取 Collections.Generic 的元素

这将适用于大多数集合。也许它会为你工作。

    object fieldValue = fieldInfo.GetValue( obj );
    if ( fieldValue is IEnumerable )
      {
      foreach ( var item in (IEnumerable)fieldValue )
        {
        //do your stuff
        Console.WriteLine(item.GetType());
        Console.WriteLine(item);
        }
      }