反射,将 List 转换为 IEnumerable
2023-12-02

我有一个类,我需要通过对象属性反映并检查值和其他内容。当我有一个列表并尝试将项目转换为 IEnumerable 时,一切似乎都工作异常。

if (propType.GetInterfaces().Contains(typeof(IEnumerable)))
{
    var value = prop.GetValue(source);
    Type underlyingType = propType.GetGenericArguments()[0];

    var enumerable = value as IEnumerable<object>;
    if(enumerable == null)
    {
        // problem here......
    }

    // Check the items in the list
}

propType 返回为:

FullName = "System.Collections.Generic.List`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"

底层类型返回为:

System.Int32

当它是自定义类列表时,这是有效的,当它是值类型时,它似乎会被破坏。

有人可以帮忙吗?


事实是int是值类型在这里有所不同。根据 C# 规范,泛型类型之间必须存在引用或标识转换,以使类型可以进行变体转换:

A type T<A1, …, An>可方差转换为类型T<B1, …, Bn> if T是使用变体声明的接口或委托类型 类型参数T<X1, …, Xn>,并且对于每个变体类型参数Xi以下其中一项成立:

  • Xi是协变的,并且存在隐式引用或身份转换Ai to Bi
  • Xi是逆变的,并且存在隐式引用或身份转换Bi to Ai
  • Xi是不变的,并且存在身份转换Ai to Bi

IEnumerable<T>是协变的,所以我标记的线很重要。Ai你的情况是int and Bi is int。没有参考转换int to object, 因为int不是引用类型。这两者之间也不存在身份转换,因为它们并不相同。

我不知道你问题的全部背景,但你可以使用非通用IEnumerable代替IEnumerable<object>。它们几乎是一样的。但是,您可能在这里面临 XY 问题,因此如果不了解更多有关您的案例的信息,就很难为您提供帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反射,将 List 转换为 IEnumerable 的相关文章

随机推荐