如何将非genericsIList转换为IList <T>?

我有一个类需要IList<T> ,但我有一个来自NHibernate quere的Systems.Collection.IList

我想创build一个将其转换为IList<T> 。 我该怎么做呢?

如果你确定所有的元素都inheritance自T(或者你正在使用的任何types)

 IList<T> myList = nonGenericList.Cast<T>().ToList(); 

如果您不确定:

 IList<T> myList = nonGenericList.OfType<T>().ToList(); 

当然,你将需要System.Linq命名空间:

 using System.Linq; 

CastOfType返回IEnumerable<T>实现,而不是IList<T>实现,所以它们对你没用。

打电话。 Cast<T>().ToList将导致列表的额外副本,这可能会对性能产生不利影响。

一个更好的(恕我直言)方法将是创build一个包装类,并在飞行中进行转换。 你想要这样的东西:

 class ListWrapper<T> : IList<T> { private IList m_wrapped; //implement all the IList<T> methods ontop of m_wrapped, doing casts //or throwing not supported exceptions where appropriate. //You can implement 'GetEnumerator()' using iterators. See the docs for //yield return for details } 

这将有利于不创build整个列表的另一个副本。

弗雷德里克是对的。 但是Nhibernate也可以select返回多个结果集。 例如:

  IList multiResults = session.CreateMultiCriteria() .Add(pageCriteria) .Add(countCriteria) .List(); 

在上面的调用中没有选项来返回一个打字清单。 所以它必须像上面提到的那样stream传,就像这样:

  IList<T> results = ((IList)multiResults[0]).Cast<T>().ToList(); IList counts = (IList)multiResults[1]; 

一种方法是使用Linq,像list.OfType<T>().Cast<T>()

难道你不能实现NHibernate返回给你一个IList? ICriteria接口定义一个List<T>方法…

Frederik是正确的,NHibernate已经这样做了。

 var data = query.List<MyType>(); 

这将导致您指定的types的IList。 在这种情况下, IList<MyType>