簡體   English   中英

反射,將List <Int32>轉換為IEnumerable <object>

[英]Reflection, Casting List<Int32> to IEnumerable<object>

我有一個類,我需要通過對象屬性反映並檢查值和其他東西。 當我有一個列表並嘗試將項目轉換為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]]”

underlyingType返回為:

System.Int32

當它是一個自定義類列表時,它就會工作,當它是一個值類型時它似乎正在破壞。

有人可以幫忙嗎?

int是值類型的事實在這里有所不同。 根據C#規范,泛型類型之間必須存在引用或標識轉換,以使類型變量可轉換:

類型T<A1, …, An>是方差可轉換為類型T<B1, …, Bn>如果T是使用變量類型參數T<X1, …, Xn>聲明的接口或委托類型,並且對於每個變體類型參數Xi ,以下之一成立:

  • Xi是協變的,並且從AiBi存在隱式參考或身份轉換
  • Xi是逆變的,並且從BiAi存在隱式參考或身份轉換
  • Xi是不變的,並且從AiBi存在身份轉換

IEnumerable<T>是協變的,因此我標記的行很重要。 在你的情況下AiintBiint 沒有從intobject引用轉換,因為int不是引用類型。 這兩者之間也沒有身份轉換,因為它們不一樣。

我不知道你的問題的整個上下文,但你可以使用非通用IEnumerable而不是IEnumerable<object> 他們幾乎是一樣的。 但是,您可能在這里面臨XY問題,因此在不了解您的情況的情況下很難幫助您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM