繁体   English   中英

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

[英]How do I convert a non-Generic IList to IList<T>?

我有想要IList<T> ,但是我有一个来自NHibernate队列的Systems.Collection.IList

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

如果您确定所有元素都继承自T(或您使用的任何类型)

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将导致列表的额外副本,这可能会对性能产生不利影响。

更好的(IMHO)方法是只创建一个包装器类并即时进行转换。 您想要这样的东西:

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
}

这样的好处是不会创建整个列表的另一个副本。

弗雷德里克是正确的。 但是Nhibernate也可以选择返回多个结果集。 例如:

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

在上述调用中,没有选择返回类型列表的选项。 因此,必须如上所述进行转换,如下所示:

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

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

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

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

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

您无法实现NHibernate返回IList吗? ICriteria接口定义List<T>方法...

在这种情况下,无需使用Linq(OfType()或.Cast)。 NHibernate实现就足够了。

您只需要使用:

var results= query.List<YourType>();

代替

var results= query.List<>();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM