2013-01-08 103 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