在这个例子中,如何摆脱双重向下转换?

时间:2015-08-18 00:44:21

标签: c#

我有以下代码:

List<object> qIDs = myObject.ExtraData as List<object>; //ExtraData is of type object - Fixed and can't be changed. Old (bad) design.
List<Tuple<string, bool>> itemIds = new List<Tuple<string, bool>>();

foreach (object tuple in qIDs)
{
    itemIds.Add((Tuple<string, bool>)tuple);
}
//do something with itemIds

基本上myObject.ExtraDataobject,它存储元组{string, bool}的列表。但是为了检索List<Tuple<,>>我必须向下转发两次:一次到List<object>并迭代每个元素并将其添加到List<Tuple<string, bool>>。无论如何要摆脱这个?

背景/元:List<object>的需求是光荣黑客的一部分,目前是List包含两种不同类型对象的唯一方法 - 元组列表和其他一些结构列表,所以防止使用列表的代码针对列表中的每种类型的对象进行更改。

2 个答案:

答案 0 :(得分:3)

IEnumerable.OfType只能用于返回指定Type的对象。

using System.Linq;

var extra = (IEnumerable) myObject.ExtraData;
var itemIds = extra.OfType<Tuple<string, bool>>();

//do something with itemIds

上述代码的另一个好处是不会浪费内存和另一个列表副本。

答案 1 :(得分:2)

如果您不能按other answer中的建议使用foreach

OfType可以为您做第二次演员:

foreach (Tuple<string, bool> tuple in myObject.ExtraData as List<object>)
{
    itemIds.Add(tuple);
}