如何枚举对象?

时间:2014-08-20 16:46:15

标签: c#

我试图枚举实际可枚举的Object,但该类型存储在Type变量

public Type MyListType { get; set; }
public Object MyList { get; set; }
...
foreach (var item in Convert.ChangeType(MyList, MyListType))
{
...
}

这显然会产生错误,因为ChangeType仍会返回Object。如何将MyList转换为可枚举类型,尤其是MyListType?

更新

更明确一点,Object是BindingList<T>类型,其中T驻留在MyListType中。

2 个答案:

答案 0 :(得分:5)

好吧,如果实际可枚举,可能是它实现了IEnumerable ...所以你可以使用:

foreach (object item in (IEnumerable) MyList)
{
    ...
}

无论如何,item的编译时类型不会比object更好......

答案 1 :(得分:0)

如果类型实际实现IEnumerable,您只需将其强制转换为:

foreach (object item in (IEnumerable) MyList)
{
    //...
}

如果类型的GetEnumerator方法符合foreach的条件,从概念上讲可以枚举,但实际上没有实现IEnumerable,那么您需要使用dynamic将问题推迟到运行时,此时它将能够确定动态调用哪个方法。

foreach (object item in (dynamic) MyList)
{
    //...
}

(请注意,虽然这是一个有趣的学术练习,但我真的希望你在实际的生产代码中实际上没有这样的对象;你几乎肯定不应该在实验。)