【问题标题】:C# How to convert ArrayList of typed objects to a typed List?C# 如何将类型化对象的 ArrayList 转换为类型化列表?
【发布时间】:2011-08-18 04:10:57
【问题描述】:

我有一个特定类型的对象的 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();

所以基本上我将类型名称作为字符串,我可以从名称创建一个类型,并创建一个包含多个类型化对象的集合,但是如何将其转换为列表?我正在为属性补水,当我执行 SetValue 时,我的属性类型需要匹配。

非常感谢。

【问题讨论】:

  • 你知道编译时的类型,还是动态的?
  • 动态,我从 JSON 转换,我知道类型为字符串,我可以创建类型化对象数组,但我需要输出为 List
  • 所以...您正试图将 Array(类型化)转换为 List,对吗?并且您将“type T”的名称存储在一个字符串(和一个 Type 对象)中。

标签: c# types


【解决方案1】:

如果您使用 .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 });

【讨论】:

  • 如果我没有遗漏什么,你不能直接在ArrayList 上调用ToList<T>,因为不是通用的。在此之前您应该致电Cast<T>OfType<T>...
  • @digEmAll:我不是——我在 typedArray 上调用它,这是一个由 myArrayList.ToArray(objType) 调用产生的类型化数组。
  • 不要和 john skeet 争论 =)
【解决方案2】:

创建一个

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

然后

list.AddRange(yourArray); 

【讨论】:

  • 这行不通,因为Array 没有实现IEnumerable&lt;T&gt;
  • 我在编译时没有 可用,我从一个具有类型名称的字符串开始,然后我将类型解析为类型
  • 无论如何都不需要AddRange()List&lt;T&gt; 构造函数接受相同类型的数组。
【解决方案3】:

使用扩展方法:.ToList&lt;myType&gt;()

【讨论】:

  • ToList()source 序列泛型类型上是泛型的,因此调用将失败,因为 ArrayList 根本不是泛型的。
  • myType 在我的例子中是一个类型变量,我没有实际的类型。干杯。
【解决方案4】:

改用通用的List&lt;&gt; 类型。

【讨论】:

  • 他问的不是这个吗?如何将数组转换为通用列表?
  • 只有类型作为变量时,如何使用 List?谢谢。
  • @Jason Lavigne:为什么你的类型是在字符串中指定的?
  • @BoltClock:他没有使用泛型,所以我的建议是他使用。
  • @Bernard,因为我将 JSON 转换为类型化对象列表,所以我可以使用反射很好地填充对象,但现在我需要一个类型化列表。
【解决方案5】:

必须是List&lt;T&gt; 还是IEnumerable&lt;T&gt;

从 Linq 中获取一点你可以做的事情:

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

创建以下对象(假设 T = 字符串):

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

【讨论】:

    猜你喜欢
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 2011-08-16
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多