加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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<,&gt ;:

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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读