代码之家  ›  专栏  ›  技术社区  ›  riffnl

从genericlist获取索引项引发错误

  •  1
  • riffnl  · 技术社区  · 14 年前

    我正试图从泛型列表中按编号获取某个索引项,我正在获取:无法强制转换“System.Collections.generic.list”类型的对象 1[typename]' to type 'System.Collections.Generic.List 1[系统.对象]'。错误。

    我试图实现的是基于继承的基类循环(向前或向后)到某个列表;比如so(或者类似的东西):

    public class Fruit
    {
      public string Name {get;set;}
    }
    public class Apple : Fruit
    {
      public bool IsSour {get;set;}
    }
    public class Orange : Fruit
    {
      public bool Juicy {get;set;}
    }
    public List<Apple> Apples = new List<Apple>();
    public List<Orange> Oranges = new List<Oranges>();
    

    我想要的是这样的:

    public string[] BuildList(object GenericListHere, bool Backwards)
    {
      for(int i=GenericListHere.Length-1;i>=0;i--)
      {
        string MyName = GenericListHere[i].Name;
    

    上面的代码有点伪代码,但是我想输入苹果或桔子列表以获得结果。 我事先不知道我得到的是哪个对象,所以我得到了这样的计数/长度(不是psuedocoded),其中TestObj只是我得到的对象:

    int iBound = -1;
    try
    {
        System.Reflection.PropertyInfo oInfo = TestObj.GetType().GetProperty("Count");
        iBound = (int)oInfo.GetValue(TestObj, null);
    }
    catch
    {
    

    如果iBound>=0,则它是一个集合。下一部分。。我有点迷茫。。。

     if (iBound != -1)
     {
          int iLoopStart = (backwardsLoop ? iBound - 1 : 0);
          int iLoopEnd = (backwardsLoop ? -1 : iBound);
          int iLoopDifference = (backwardsLoop ? -1 : +1);
          for (int iLoop = iLoopStart; iLoop != iLoopEnd; iLoop += iLoopDifference)
          {
               // THIS IS REALLY BAD CODED.. BUT I DONT GET IT
               object VarCollection = TestObj;
               object[] arInt = new object[1];
               arInt.SetValue(iLoop, 0);
               Type[] tArray = new Type[1];
               tArray.SetValue(typeof(int), 0);
               object oElem = ((System.Collections.Generic.List<object>)VarCollection)[iLoop];
    

    有没有人有过这样的经历?蒂亚!

    3 回复  |  直到 14 年前
        1
  •  0
  •   leppie    14 年前

    把它扔给 IList 使用索引器。

        2
  •  1
  •   Ani    14 年前

    事实上 需要按索引访问列表中的元素,因为其目的似乎只是将一系列水果投影到一系列水果名称中。如果你 但是需要按索引访问元素(例如,如果您坚持使用 for 循环),如果使用泛型,则不应该是问题;索引器 IList<T> Count 属性在泛型代码中很容易被发现。

    以下使用泛型约束的解决方案在.NET 3.5中应该可以正常工作:

    public static string[] BuildList<T>(IList<T> list, bool backwards) 
        where T : Fruit
    {
      var names = list.Select(fruit => fruit.Name);
      return (backwards ? names.Reverse() : names).ToArray();
    }
    

    在.NET 4.0中,a List<Apple> IEnumerable<Fruit> . 因此,以下签名也应起作用:

    public static string[] BuildList(IEnumerable<Fruit> list, bool backwards) 
    

    另一方面,您可能需要考虑返回 IEnumerable<string> 相反,如果调用方愿意,可以让它将结果推送到数组中。

        3
  •  0
  •   Marc Gravell    14 年前

    如果你要和 object IList / ICollection IList<T> / ICollection<T> / List<T> ;仍然有索引器、迭代、添加等