2016-07-05 69 views
3

我無法遍歷傳遞給函數的字典作爲泛型。例如,我有一個從數據庫加載數據的函數。C#迭代作爲通用字典傳遞的字典

public T Load<T>(...) 

這個函數可以這樣調用,我沒有問題;

someclasstype data = Load<someclasstype>(...); 

List<someclasstype> data = Load<List<someclasstype>>(...); 

我最近試圖擴大這是能夠處理詞典的歡迎,並調用它像這樣:

Dictionary<long, someclasstype> data = Load<Dictionary<long, someclasstype>>(...) 

我可以加載數據沒有問題,並將其存儲在字典沒問題。

在這個階段,字典,其所有keyvaluepairs被存儲在一個名爲結果變量,我創建一個IEnumerable與

IEnumerator resultIdx = ((IEnumerable)result).GetEnumerator(); 
if (!resultIdx.MoveNext()) 
    return (T)result; 

object kvp = resultIdx.Current; 

到目前爲止好。我可以在手錶中查看該鍵的值和值的值,或者通過鼠標懸停在kvp變量上。

但我無法弄清楚如何從kvp中獲取keyvaluepair的值部分。

// None of these work - I get compile time errors, unboxing errors, or invalid cast errors. 
object item = ((KeyValuePair<TKey, TValue>)kvp).Value; 

object item = ((KeyValuePair<long, object>)kvp).Value; 

object item = ((T)kvp).Value // Never had a hope for this, but desperation... 

有沒有人有任何想法我可以做到這一點?

+0

使用反射? 'object key kvp.GetType()。GetProperty(「Key」)。GetValue(kvp); ()「)。GetValue(kvp);' 不是非常優化,但可以工作... – Dede

+0

真棒,謝謝德德...完美的作品。這個功能已經大量使用反射,所以我不擔心(即速度)。 –

+0

帶有枚舉器的部分是函數「Load 」的這一部分,還是在「Load 」之外?因爲如果它在外面,爲什麼不使用'Dictionary '提供的'GetEnumerator'方法? – ckruczek

回答

2

嘗試添加dynamic kvp = resultIdx.Current;。那麼你可以使用kvp.Value

1

你可以將函數改寫成兩個函數。

public T Load<T>(...) 
//Or maybe public List<T> Load<T>(...) 

public Dictionary<long, T> LoadD<T>(...) 

然後你就可以在LoadD投結果KeyValuePair<long, T>。您可以撥打加載加載D以最小化代碼重寫。

+0

我想避免公開字典 LoadD (...),因爲long(在本例中)表示數據庫中的主鍵。這不能保證,但它的主鍵可能是其他類型或類型的組合。我不想寫一堆重載的Load()函數。 –

+0

@ThereandThat怎麼樣'字典 LoadD (...)'? :) –

0

回答德德在給予:

「?使用反射

object key kvp.GetType().GetProperty("Key").GetValue(kvp); 
object value kvp.GetType().GetProperty("Value").GetValue(kvp); 

不是很優化,但可以工作... - 德德24」