![](/img/trans.png)
[英]How to simplify the initialization of List<List<Int32>> as IEnumerable<IEnumerable<Int32>>?
[英]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
是協變的,並且從Ai
到Bi
存在隱式參考或身份轉換Xi
是逆變的,並且從Bi
到Ai
存在隱式參考或身份轉換Xi
是不變的,並且從Ai
到Bi
存在身份轉換
IEnumerable<T>
是協變的,因此我標記的行很重要。 在你的情況下Ai
是int
, Bi
是int
。 沒有從int
到object
引用轉換,因為int
不是引用類型。 這兩者之間也沒有身份轉換,因為它們不一樣。
我不知道你的問題的整個上下文,但你可以使用非通用IEnumerable
而不是IEnumerable<object>
。 他們幾乎是一樣的。 但是,您可能在這里面臨XY問題,因此在不了解您的情況的情況下很難幫助您。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.