c#访问作为对象类型传递的列表元素

时间:2015-12-14 07:10:19

标签: c# list object reflection

我想访问传入的列表成员" object" (该函数也处理其他数据类型,如数组)。不幸的是,虽然这有效:

List<object> objectlist = new List<object> { "1", "2" };
object res = ((List<object>)((object)objectlist))[0];

这不是:

List<string> strlist = new List<string> { "1", "2" };
res = (string)((List<object>)((object)strlist))[0];

尽管它可以使用数组。

似乎无法将常规列表转换为List。

使用反射(但使用GetMethods以避免重复的字符串搜索):

MethodInfo info = ((object)list).GetType().GetMethod("get_Item");
object s1 = (object)info.Invoke(((object)list), new object[] { 0 });

这是唯一的方法吗?

2 个答案:

答案 0 :(得分:3)

不,List<string>不是List<object> ...虽然由于通用协方差, IEnumerable<object>。但是,List<int>甚至不是IEnumerable<object>,因为协方差不适用于值类型类型参数。幸运的是, IEnumerable

因此,为了获得您知道实现IEnumerable的任意对象的第一个元素,我只是使用:

object first = ((IEnumerable) source).Cast<object>().First();

(由于IEnumerator没有实施IDisposable,更多&#34;手动&#34;这样做的方式最终有点繁琐。)

答案 1 :(得分:1)

List<T>实现非通用IList。如果您只想从列表中检索项目,则可以转换为该项目。一维数组也实现它,因此转换将适用于数组和列表

res = (string)((IList)((object)strlist))[0];