我目前正在研究一个给出根对象链接的类,并获取该类指向的所有内容,然后创建一个打印输出,以便可以对其进行过滤,并搜索以查找类似的内容空指针,以及引用同一对象的多个东西。
我能够通过使用LINQ和反射来完成大部分工作,除了能够查看List或Dictionary的元素。
使用反射我可以得到typeof(List<"someClass">)
或typeof(Dictionary&lt;&#34; someOtherClass&#34;&gt;)。这个问题可能听起来微不足道(因为列表中包含的类型应该是已知的),但在当前基准程序的许多地方,有任意数量的列表和字典可能几乎包含程序集中的任何类对象。
问题是:我将如何从存储的FieldInfo中进行测试,以便发现它具有其中一个Collections.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;
}
答案 0 :(得分:0)
这适用于大多数收藏品。也许它会对你有用。
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);
}
}