【问题标题】:c# access elements of list passed as object typec#访问作为对象类型传递的列表的元素
【发布时间】:2015-12-14 07:10:18
【问题描述】:

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

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 object reflection


    【解决方案1】:

    不,List&lt;string&gt; 不是List&lt;object&gt;...虽然它一个IEnumerable&lt;object&gt;,由于通用协方差。但是,List&lt;int&gt; 甚至不是IEnumerable&lt;object&gt;,因为协方差不适用于值类型类型参数。幸运的是,它IEnumerable

    因此,要获取您知道实现IEnumerable 的任意对象的第一个元素,我只需使用:

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

    (由于IEnumerator 没有实现IDisposable,更多的“手动”方式最终会有点繁琐。)

    【讨论】:

      【解决方案2】:

      List&lt;T&gt; 实现非泛型IList。如果您只想从列表中检索项目,您可以投射到它。一维数组也实现了它,所以转换对数组和列表都有效

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-26
        • 2019-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-28
        • 1970-01-01
        • 2010-10-09
        相关资源
        最近更新 更多