如何将非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;
Cast
和OfType
返回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>
。