reflection,将List 转换为IEnumerable

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

if (propType.GetInterfaces().Contains(typeof(IEnumerable))) { var value = prop.GetValue(source); Type underlyingType = propType.GetGenericArguments()[0]; var enumerable = value as IEnumerable; 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]]”

underlyingType返回为:

System.Int32

当它是一个自定义类列表时,它就会工作,当它是一个值类型时,它似乎正在破坏。

有人可以帮忙吗?

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

类型T是方差可转换为类型T如果T是接口或使用变量类型参数T声明的委托类型,并且对于每个变体类型参数Xi ,以下之一成立:

  • Xi是协变的,并且从AiBi存在隐式参考或身份转换
  • Xi是逆变的,并且从BiAi存在隐式参考或身份转换
  • Xi是不变的,并且从AiBi存在身份转换

IEnumerable是协变的,因此我标记的行很重要。 在你的情况下AiintBiint 。 没有从intobject引用转换,因为int不是引用类型。 这两者之间也没有身份转换,因为它们不一样。

我不知道你的问题的整个上下文,但你可以使用非通用IEnumerable而不是IEnumerable 。 他们几乎是一样的。 但是,您可能在这里面临XY问题,因此在不了解您的情况的情况下很难帮助您。