C#如何将类型化对象的ArrayList转换为类型化列表?

时间:2011-08-17 19:48:57

标签: c# types

我有一个特定类型的对象ArrayList,我需要将这个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时,我的属性类型需要匹配。

非常感谢。

5 个答案:

答案 0 :(得分: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 });

答案 1 :(得分:1)

使用扩展方法:.ToList<myType>()

答案 2 :(得分:1)

创建

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

然后

list.AddRange(yourArray); 

答案 3 :(得分:0)

改为使用通用List<>类型。

答案 4 :(得分:0)

它必须是List<T>还是IEnumerable<T>呢?

从Linq那里拿一点你可以做到:

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

创建以下对象(假设T = string):

System.Linq.Enumerable+<CastIterator>d__b1`1[System.String]