2011-08-17 70 views
1

我有一個特定類型的對象的ArrayList,我需要將此ArrayList轉換爲類型列表。這裏是我的代碼C#如何將類型化對象的ArrayList轉換爲類型化列表?

Type objType = Type.GetType(myTypeName); 

ArrayList myArrayList = new ArrayList(); 

object myObj0 = Activator.CreateInstance(type); 
object myObj1 = Activator.CreateInstance(type); 
object myObj2 = Activator.CreateInstance(type); 

myArrayList.Add(myObj0); 
myArrayList.Add(myObj1); 
myArrayList.Add(myObj2); 

Array typedArray = myArrayList.ToArray(objType); // this is typed 
object returnValue = typedArray.ToList(); // this is fake, but this is what I am looking for 

沒有ToList()可用於數組,這就是我要尋找

object returnValue = typedArray.ToList(); 

行爲所以基本上我有類型的字符串名字,我可以從名稱創建一個Type,並創建一個包含多個輸入對象的集合,但是如何將它轉換爲List?我正在保溼一個屬性,當我做一個SetValue時,我的屬性類型需要匹配。

非常感謝。

+0

你知道在編譯時的類型,或者是這動態? – BoltClock

+0

動態,我從JSON轉換,我知道類型爲一個字符串,我可以創建類型的對象數組,但我需要輸出爲List

+0

所以...你試圖隱藏數組(鍵入)到列表,是嗎?而且你有一個名爲「type T」的字符串(和一個Type對象)。 –

回答

5

如果您使用.NET 4,動態類型可以幫助 - 它可以執行類型推斷,因此您可以撥打ToList,誠然不是擴展方法:

dynamic typedArray = myArrayList.ToArray(objType);  
object returnValue = Enumerable.ToList(typedArray); 

否則,您需要使用反射:

object typedArray = myArrayList.ToArray(objType); 
// It really helps that we don't need to work through overloads... 
MethodInfo openMethod = typeof(Enumerable).GetMethod("ToList"); 
MethodInfo genericMethod = openMethod.MakeGenericMethod(objType); 
object result = genericMethod.Invoke(null, new object[] { typedArray }); 
+0

如果我沒有遺漏某些東西,則不能直接在'ArrayList'上調用'ToList ',因爲它不是通用的。你應該在這之前調用'Cast '或'OfType '... – digEmAll

+0

@digEmAll:我不是 - 我在'typedArray'上調用它,這是一個從'myArrayList.ToArray(objType )'電話。 –

+0

哦,你是對的,我錯過了那部分,對不起 – digEmAll

1

使用的extenstion方法:.ToList<myType>()

+0

'ToList()'在* source *序列泛型上是泛型的,所以調用將會失敗,因爲'ArrayList'根本不是泛型的。 – dlev

+0

myType在我的情況下是一個Type變量,我沒有實際的類型。乾杯。 –

0

使用通用List<>類型來代替。

+0

他不是在問什麼?如何將數組轉換爲通用列表? – BoltClock

+0

當我只有類型作爲變量時,如何使用List <>?謝謝。 –

+0

@Jason Lavigne:你爲什麼在字符串中指定你的類型? – Bernard

1

創建

List<YourType> list = new List<YourType>; 

然後

list.AddRange(yourArray); 
+0

這將不起作用,因爲'Array'不執行'IEnumerable '。 – dlev

+0

我沒有在編譯時可用,我從具有類型名稱的字符串開始,然後我將其類型解析爲類型 –

+0

無論如何不需要'AddRange()'List '構造函數接受相同類型的數組。 – BoltClock

0

是否必須是List<T>IEnumerable<T>會做什麼?

以一點點從LINQ的你可以這樣做:

object returnValue = myArrayList.Cast<string>(); 

它創建下列對象(假定T =字符串):

System.Linq.Enumerable+<CastIterator>d__b1`1[System.String] 
相關問題