C#反射 – 如何知道对象o是否类型为KeyValuePair然后投射?

前端之家收集整理的这篇文章主要介绍了C#反射 – 如何知道对象o是否类型为KeyValuePair然后投射?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试从 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);

猜你在找的C#相关文章