我正在尝试从
LinqPad中编写一个Dump()方法,相当于iin C#,用于我自己的amusment.我从
Java转移到C#,这是一个练习而不是业务需求.除了倾销词典之外,我已经有了几乎所有的工作.
问题是KeyValuePair是一个Value类型.对于大多数其他Value类型,我只是调用ToString方法,但是这不足够,因为KeyValuePair可能包含Enumerable和其他具有不良ToString方法的对象.所以我需要解决,如果它是一个KeyValuePair,然后转换它.在Java中,我可以使用通配符泛型,但我不知道C#中的等价物.
您的任务,给定一个对象o,确定它是否是一个KeyValuePair,并在其键值和值上调用Print.
Print(object o) { ... }
谢谢!
解决方法
如果您不知道存储在KeyValuePair中的类型,则需要执行一些反映代码.
我们来看看需要什么:
首先,我们确保值不为null:
if (value != null) {
那么我们确保这个值是通用的:
Type valueType = value.GetType(); if (valueType.IsGenericType) {
然后,提取通用类型定义,即KeyValuePair<,> ;:
Type baseType = valueType.GetGenericTypeDefinition(); if (baseType == typeof(KeyValuePair<,>)) {
然后提取其中的值的类型:
Type[] argTypes = baseType.GetGenericArguments();
最终代码:
if (value != null) { Type valueType = value.GetType(); if (valueType.IsGenericType) { Type baseType = valueType.GetGenericTypeDefinition(); if (baseType == typeof(KeyValuePair<,>)) { Type[] argTypes = baseType.GetGenericArguments(); // now process the values } } }
如果您发现该对象确实包含一个KeyValuePair
object kvpKey = valueType.GetProperty("Key").GetValue(value,null); object kvpValue = valueType.GetProperty("Value").GetValue(value,null);