C#反射 – 如何知道对象o是否类型为KeyValuePair然后投射?
发布时间:2020-12-15 17:45:35 所属栏目:百科 来源:网络整理
导读:我正在尝试从 LinqPad中编写一个Dump()方法,相当于iin C#,用于我自己的amusment.我从 Java转移到C#,这是一个练习而不是业务需求.除了倾销词典之外,我已经有了几乎所有的工作. 问题是KeyValuePair是一个Value类型.对于大多数其他Value类型,我只是调用ToString
我正在尝试从
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); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |