从system.object向上转换为通用对象

时间:2009-02-17 11:20:43

标签: c# generics .net-2.0

我有一些简单的代码来证明我的问题:

private void InitializeOther()
{
  List<Foo> list = new List<Foo>();
  Casting(list);
}

//in the "real" case I have no knowledge of o, other than it could be a List<>
private void Casting(object o)
{
  Type t = o.GetType();
  while (t.BaseType != typeof(Object))
  {
    if (t.IsGenericType && typeof(List<>) == t.GetGenericTypeDefinition())
    {
      //now I know that o is of type List<>. How can I now access List<> members from o?
      break;
    }
    t = t.BaseType;
  }
}

所以,我可以确定对象o是List<T>的(或派生的),但现在我希望能够访问o上的List<T>成员,这意味着将其转换为{ {1}}。在我的“真实”案例中,我不了解Foo。

我很确定它可以做到,如果你知道怎么做,如果你能和我分享你的知识,我将非常感激!

1 个答案:

答案 0 :(得分:0)

小型黑客将尝试将o转换为非通用IList,因为List<T>实现了通用和非通用接口。 Collection<T>也是如此,它是用户集合中使用最多的基类。

如果这不是一个选项,你可以随时使用反射方法调用(后期绑定):MethodInfo.Invoke()等。