C# 遍历作为泛型传递的字典
C# Iterating over a dictionary passed as a generic
我在尝试遍历作为泛型传递给函数的字典时遇到问题。例如,我有一个从数据库加载数据的函数。
public T Load<T>(...)
这个函数可以这样调用,我没问题;
someclasstype data = Load<someclasstype>(...);
List<someclasstype> data = Load<List<someclasstype>>(...);
我最近尝试扩展它以使其也能够处理字典,并这样称呼它:
Dictionary<long, someclasstype> data = Load<Dictionary<long, someclasstype>>(...)
我可以毫无问题地加载数据并将其存储在字典中。
在这个阶段,字典及其所有键值对都存储在一个名为 result 的变量中,我正在使用
创建一个 IEnumerable
IEnumerator resultIdx = ((IEnumerable)result).GetEnumerator();
if (!resultIdx.MoveNext())
return (T)result;
object kvp = resultIdx.Current;
到目前为止一切顺利。我可以在手表中看到键的值和值的值,或者通过鼠标悬停在 kvp 变量上。
但我不知道如何从 kvp 中获取键值对的值部分。
// 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...
有人知道我该怎么做吗?
你可以把函数重写成两个函数,比如。
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"
尝试添加 dynamic kvp = resultIdx.Current;
。然后你可以使用 kvp.Value
我在尝试遍历作为泛型传递给函数的字典时遇到问题。例如,我有一个从数据库加载数据的函数。
public T Load<T>(...)
这个函数可以这样调用,我没问题;
someclasstype data = Load<someclasstype>(...);
List<someclasstype> data = Load<List<someclasstype>>(...);
我最近尝试扩展它以使其也能够处理字典,并这样称呼它:
Dictionary<long, someclasstype> data = Load<Dictionary<long, someclasstype>>(...)
我可以毫无问题地加载数据并将其存储在字典中。
在这个阶段,字典及其所有键值对都存储在一个名为 result 的变量中,我正在使用
创建一个 IEnumerableIEnumerator resultIdx = ((IEnumerable)result).GetEnumerator();
if (!resultIdx.MoveNext())
return (T)result;
object kvp = resultIdx.Current;
到目前为止一切顺利。我可以在手表中看到键的值和值的值,或者通过鼠标悬停在 kvp 变量上。
但我不知道如何从 kvp 中获取键值对的值部分。
// 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...
有人知道我该怎么做吗?
你可以把函数重写成两个函数,比如。
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"
尝试添加 dynamic kvp = resultIdx.Current;
。然后你可以使用 kvp.Value