我想访问传入的列表成员" 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 });
这是唯一的方法吗?
答案 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];