在多维对象内进行深度搜索
本文关键字:深度 搜索 对象 | 更新日期: 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->field1
或record.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;
}
}
编译器应该优化上述方法