C#迭代作为泛型传递的字典

时间:2016-07-05 05:27:33

标签: c# generics ienumerable

我无法尝试迭代传递给函数的字典作为泛型。例如,我有一个从数据库加载数据的函数。

public T Load<T>(...)

这个函数可以这样调用,我没有问题;

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

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

我最近试图将其扩展为能够处理词典,并将其称为:

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

我可以毫无问题地加载数据并将其存储在字典中没问题。

在这个阶段,字典及其所有keyvaluepair都存储在一个名为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...

有谁知道我该怎么做?

3 个答案:

答案 0 :(得分:2)

尝试添加dynamic kvp = resultIdx.Current;。然后,您可以使用kvp.Value

答案 1 :(得分:1)

您可以将该功能重写为两个函数,例如。

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

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

然后您可以将结果转换为LoadD中的KeyValuePair<long, T>。您可以从 LoadD 调用加载以最大限度地减少代码重写。

答案 2 :(得分:0)

Dede在评论中提供的答案:

“使用反思?

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

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