gpt4 book ai didi

c# - 使用反射获取通用 IDictionary 的值

转载 作者:太空狗 更新时间:2023-10-29 17:30:49 25 4
gpt4 key购买 nike

我有一个实现 IDictionary<T, K> 的实例,我在编译时不知道T和K,想从中获取所有元素。我不想使用 IEnumerable由于某种原因,这将是 IDictionary 实现的唯一非通用接口(interface).

我目前的代码:

// getting types
Type iDictType = instance.GetType().GetInterface("IDictionary`2");
Type keyType = iDictType.GetGenericArguments()[0];
Type valueType = iDictType.GetGenericArguments()[1];

// getting the keys
IEnumerable keys = (IEnumerable)dictType.GetProperty("Keys")
.GetValue(instance, null);

foreach (object key in keys)
{
// ==> this does not work: calling the [] operator
object value = dictType.GetProperty("Item")
.GetValue(instance, new object[] {key } );


// getting the value from another instance with TryGet
MethodInfo tryGetValue = iDictType.GetMethod("TryGetValue");
object[] arguments = new object[] { key, null };
bool hasElement = (bool)tryGetValue.Invoke(otherInstance, arguments);
object anotherValue = arguments[1];
}

我也可以调用 TryGetValue,但我认为应该可以调用 [] 运算符。谁能帮帮我?

最佳答案

最好弄清楚 TKey/TValue,然后通过MakeGenericMethod 切换到常规代码- 像这样:

(编辑 - 如果它们属于同一类型,您也可以将 otherInstance 作为参数传入)

static class Program
{
static void Main()
{
object obj = new Dictionary<int, string> {
{ 123, "abc" }, { 456, "def" } };

foreach (Type iType in obj.GetType().GetInterfaces())
{
if (iType.IsGenericType && iType.GetGenericTypeDefinition()
== typeof(IDictionary<,>))
{
typeof(Program).GetMethod("ShowContents")
.MakeGenericMethod(iType.GetGenericArguments())
.Invoke(null, new object[] { obj });
break;
}
}
}
public static void ShowContents<TKey, TValue>(
IDictionary<TKey, TValue> data)
{
foreach (var pair in data)
{
Console.WriteLine(pair.Key + " = " + pair.Value);
}
}
}

关于c# - 使用反射获取通用 IDictionary 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/852233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com