我无法尝试迭代传递给函数的字典作为泛型。例如,我有一个从数据库加载数据的函数。
public T Load<T>(...)
这个函数可以这样调用,我没有问题;
someclasstype data = Load<someclasstype>(...);
List<someclasstype> data = Load<List<someclasstype>>(...);
我最近试图将其扩展为能够处理词典,并将其称为:
Dictionary<long, someclasstype> data = Load<Dictionary<long, someclasstype>>(...)
我可以毫无问题地加载数据并将其存储在字典中没问题。
在这个阶段,字典及其所有keyvaluepair都存储在一个名为result的变量中,我用
创建一个IEnumerableIEnumerator 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 :(得分: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“