在多维对象内进行深度搜索

本文关键字:深度 搜索 对象 | 更新日期: 2023-09-27 17:51:05

我有一个复杂的类,它的字段可以是列表、字典和任何其他类。一些基本数据类型是int, bool, string或一些枚举。我需要创建一个函数,该函数接受该类的一个实例和一个字符串,并根据是否提到字符串返回true或false。

public class Record
  {
    public Dictionary<string,int> Counts { get; set; }
    public Dictionary<string,list<string>> Syns {get; set;}
    public string Name { get; set; }
    public KeyValuePair<string,KeyValuePair<string,bool>> Stuff { get; set; }
    //etc 
  }

下面是方法应该做的

   public static bool IsValuePresent(Object o, string keyword)
     {
       //cycle through all possible string values of o and check if keyword is present. 
       //return true if so, otherwise false
     } 

可能的调用:

 Record record = dbAccess.GetCurrent();
 bool flag = IsValuePresent(record, "Name");

注意:可以使用ToJSON,但这将验证"name"是否存在于对象属性的名称中,但它应该只验证值。

在多维对象内进行深度搜索

您应该能够使用递归和System.Reflection。这是一个很好的帖子:

反射-在我自己的程序集中递归地迭代对象的属性(Vb.Net/3.5)

看:

foreach (PropertyInfo pi in o.GetType().GetProperties())

对不起,如果我误解了,但我认为您需要首先引用类中的字段

record->field1record.field1(对于静态分配的类)

我假设这些字段是一个字典类,所以你可以使用其中一个字典类方法来定位你的字符串。

record->field1.getindex("Name") 

然后你可以把整个过程包装在你的方法中,使它成为你的记录类中的一个方法,或者使它成为一个外部方法。下面我使用了一个内部方法。

template <class T>
bool Record :: IsValuePresent(T listobject, string in) {
switch (typeof(listobject))
{
   case 'dictionary'
     if(record->field1.getindex(in) != -1)  // -1 meaning not present in this example
     {
       return false;
     } else return true;
   case 'list'
    // more code
   default: 
     return false;
}

}

编译器应该优化上述方法