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 });

唯一的方法是什么?

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

不,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];