c#访问作为对象类型传递的列表的元素
本文关键字:列表 元素 类型 访问 对象 | 更新日期: 2023-09-27 18:26:43
我想访问作为"对象"传入的列表的成员(该函数还处理其他数据类型,如数组)。不幸的是,虽然这是有效的:
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];
尽管它确实适用于数组。
似乎无法将常规列表转换为列表。
正在使用反射(但使用GetMethods以避免重复的字符串搜索):
MethodInfo info = ((object)list).GetType().GetMethod("get_Item");
object s1 = (object)info.Invoke(((object)list), new object[] { 0 });
唯一的方法是什么?
List<string>
不是List<object>
。。。尽管它由于一般协方差而是CCD_ 3。然而,List<int>
甚至不是IEnumerable<object>
,因为协方差不适用于值类型的类型参数。幸运的是,它是一个IEnumerable
。
因此,要获得实现IEnumerable
的任意对象的第一个元素,我只需要使用:
object first = ((IEnumerable) source).Cast<object>().First();
(由于IEnumerator
没有实现IDisposable
,更多的"手动"方法最终会有点麻烦。)
List<T>
实现非泛型IList
。如果你只想从列表中检索项目,你可以强制转换到它。一维数组也实现了它,所以强制转换对数组和列表都有效
res = (string)((IList)((object)strlist))[0];