C# 从genericlist获取索引项引发错误

C# 从genericlist获取索引项引发错误,c#,list,collections,generics,C#,List,Collections,Generics,我正试图从泛型列表中按编号获取某个索引项,结果是:无法将“System.Collections.generic.list1[typename]”类型的对象强制转换为“System.Collections.generic.list1[System.object]”。错误 我试图实现的是基于继承的基类循环(向前或向后)到某个列表;像这样(或类似的事情): 上面的代码有点假,但我想输入苹果或橙子列表以获得结果。 我事先不知道我得到的是哪个对象,所以我得到的计数/长度如下(不是伪编码),其中TestOb

我正试图从泛型列表中按编号获取某个索引项,结果是:无法将“System.Collections.generic.list
1[typename]”类型的对象强制转换为“System.Collections.generic.list
1[System.object]”。错误

我试图实现的是基于继承的基类循环(向前或向后)到某个列表;像这样(或类似的事情):

上面的代码有点假,但我想输入苹果或橙子列表以获得结果。 我事先不知道我得到的是哪个对象,所以我得到的计数/长度如下(不是伪编码),其中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];
if(iBound!=-1)
{
int iLoopStart=(backwardsLoop?iBound-1:0);
int ILOPEND=(backwardsLoop?-1:iBound);
int iLoopDifference=(backwardsLoop?+1:+1);
对于(int-iLoop=iLoopStart;iLoop!=iLoopEnd;iLoop+=iLoopDifference)
{
//这真的很糟糕,但我不明白
对象VarCollection=TestObj;
object[]arInt=新对象[1];
arInt.SetValue(iLoop,0);
类型[]tArray=新类型[1];
tArray.SetValue(typeof(int),0);
对象oElem=((System.Collections.Generic.List)VarCollection)[iLoop];
我真正想要的是:VarCollection[iLoop],但这似乎不起作用


有没有人体验过这种列表?TIA!

只需将它转换到
IList
并使用索引器。

只需将它转换到
IList
并使用索引器。

我真的认为这里的答案不是反射;泛型应该足以满足您的需要。您似乎实际上不需要访问元素from按索引访问列表,因为其目的似乎只是将一个水果序列投影到一个水果名称序列。但是,如果您确实需要按索引访问元素(例如,如果您坚持使用
for
循环),如果使用泛型,这应该不是问题;
IList
上的索引器及其
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();
}
公共静态字符串[]构建列表(IList列表,bool向后)
T:水果
{
var Name=list.Select(fruit=>fruit.Name);
return(向后?names.Reverse():names.ToArray();
}
在.NET 4.0中,
列表
被正确地识别为
IEnumerable
。因此,以下签名也应该有效:

public static string[] BuildList(IEnumerable<Fruit> list, bool backwards) 
公共静态字符串[]构建列表(IEnumerable列表,bool向后)

另一个注释,你可能想考虑返回一个<代码> iQueDebug <代码>,让调用方将结果推到一个数组中,如果它是这样想的。

这里,我真的认为反射不是答案;泛型应该足够满足你的需要。索引,因为其目的似乎只是将一个水果序列投影到一个水果名称序列。但是,如果您确实需要通过索引访问元素(例如,如果您坚持使用
for
循环),如果使用泛型,这应该不是问题;
IList
上的索引器及其
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();
}
公共静态字符串[]构建列表(IList列表,bool向后)
T:水果
{
var Name=list.Select(fruit=>fruit.Name);
return(向后?names.Reverse():names.ToArray();
}
在.NET 4.0中,
列表
被正确地识别为
IEnumerable
。因此,以下签名也应该有效:

public static string[] BuildList(IEnumerable<Fruit> list, bool backwards) 
公共静态字符串[]构建列表(IEnumerable列表,bool向后)

另一个注释,您可能需要考虑返回一个<代码> iQueDebug <代码>,并让调用方将结果推到一个数组中,如果需要的话,

在您必须使用<代码>对象< /代码>和反射的情况下,您应该简单地使用非泛型<代码> ILIST/COD> >代码>ces而不是通用的
IList
/
ICollection
/
列表
;您仍然可以使用索引器、迭代、添加等

如果您必须使用
对象
和反射,您可能只需要使用非通用的
IList
/
ICollection
接口,而不是泛型
IList
/
ICollection
/
列表
;您仍然会有索引器、迭代、添加等

名称是一个稍微简化的示例。我需要对对象本身做更多的处理,但我不知道我得到的是什么列表。名称是一个稍微简化的示例。我需要对对象本身做更多的处理,b但我真的不知道我得到的是什么列表。@riffnl:不,你不知道。或者请解释你为什么会这样想或假设。“因为编译器这么说”很可能是我的答案。但是使用System.Collections似乎确实做到了这一点。@riffnl:Hehe,就像我对Marc评论的那样,人们忘记了非泛型的基本实现。@riffnl:不,你没有。或者请解释你为什么会这样想或假设。“因为编译器这么说”很可能是我的答案。但是使用System.Collections似乎确实做到了这一点。@riffnl:Hehe,就像我对Marc评论的那样,人们忘记了非泛型的基本实现。唉,我没有什么要说的。我没有构建我要处理的对象的基础;我只是在对象被处理时获取它们assed.@riffnl-但它们仍然是
IList
etc,而与o无关