簡體   English   中英

C#迭代作為泛型傳遞的字典

[英]C# Iterating over a dictionary passed as a generic

我無法嘗試迭代傳遞給函數的字典作為泛型。 例如,我有一個從DB加載數據的函數。

public T Load<T>(...)

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

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

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

我最近試圖擴展它以便能夠處理字典,並像這樣調用它:

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

我可以毫無問題地加載數據並將其存儲在字典中沒問題。

在這個階段,字典及其所有keyvaluepairs存儲在一個名為result的變量中,我正在創建一個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...

有誰知道我怎么能這樣做?

嘗試添加dynamic kvp = resultIdx.Current; 然后你可以使用kvp.Value

您可以將函數重寫為兩個函數,例如。

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

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

然后你可以在LoadD中將結果轉換為KeyValuePair<long, T> 您可以從LoadD調用Load以最小化代碼重寫。

答案由Dede在評論中提供:

“使用反思?

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

不是很優化,但可以工作...... - Dede 24“

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM