2011-08-17 71 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] 
相关问题