2013-01-08 64 views
-1

我有一个复杂的类,其字段可以是列表字典和任何其他类。一些基本的数据类型是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"存在的对象属性的名称中,但它应该只验证值。

+0

您的代码不会像编写的那样编译 - 请发布“Record”的真实代码,或至少一个工作示例... –

回答

0

您应该可以使用递归并使用System.Reflection。这里是一个很好的职位:

Reflection - Iterate object's properties recursively within my own assemblies (Vb.Net/3.5)

看:

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

我使用了这两个,但它不能很好地处理像'列表“或”词典“。尽管如此,谢谢你。 – AstroSharp

+0

我只是更仔细地说你的话。是的,如果我不想使用JSON,递归是我需要做的。有没有一个快速的方法呢? – AstroSharp

0

很抱歉,如果我误解,但我认为你需要首先引用字段类

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; 
} 

}

编译器应优化上述方法。

+0

他们不是所有的Dictionary类,有的可能是列表,数组,甚至是其他类。我不知道Record的结构。我需要能够发现它,因为我运行IsValuePresent。 – AstroSharp

+0

然后,您可以添加使用'typeid()'的case switch语句(进入IsValuePresent方法)。我更新了上面的代码。 – 2013-01-08 20:57:29

+0

对不起,我使用了一个C++运算符。对于C#,您可以使用'typeof(MyObject).GetProperties()' – 2013-01-08 21:08:33