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

C# 如何将非通用IList转换为IList<;T>;?,c#,C#,我有一个类需要一个IList,但我有一个Systems.Collection.IList,来自一个NHibernate查询 我想创建一个方法,将其转换为IList。我如何做到这一点?您不能实现NHibernate返回IList给您吗? ICriteria接口定义了一个列表方法…如果您确定所有元素都继承自T(或您正在使用的任何类型) 一种方法是使用Linq,比如list.OfType()或Cast()Cast和of type返回IEnumerable实现,而不是IList实现,因此它们对您没有用处

我有一个类需要一个
IList
,但我有一个
Systems.Collection.IList
,来自一个NHibernate查询


我想创建一个方法,将其转换为
IList
。我如何做到这一点?

您不能实现NHibernate返回IList给您吗?
ICriteria接口定义了一个
列表
方法…

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


一种方法是使用Linq,比如
list.OfType()
Cast()

Cast
of type
返回
IEnumerable
实现,而不是
IList
实现,因此它们对您没有用处

调用.
Cast().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
}
 IList<T> results = ((IList)multiResults[0]).Cast<T>().ToList();
            IList counts = (IList)multiResults[1];
类ListWrapper:IList { 私有IList m_包装; //在m_包装的顶部实现所有IList方法,执行强制转换 //或者在适当的情况下抛出不受支持的异常。 //您可以使用迭代器实现“GetEnumerator()”。有关详细信息,请参阅文档 //收益率申报表详情 }

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

弗雷德里克是正确的,NHibernate已经这样做了

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

这将导致指定类型的IList。在这种情况下,Fredrick是正确的。但是Nhibernate也可以选择返回多个结果集。 例如:

  IList multiResults = session.CreateMultiCriteria()
                .Add(pageCriteria)
                .Add(countCriteria)
                .List();
在上面的调用中,没有返回类型化列表的选项。因此,必须按照上述方式铸造,如下所示:

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
}
 IList<T> results = ((IList)multiResults[0]).Cast<T>().ToList();
            IList counts = (IList)multiResults[1];
IList results=((IList)multiResults[0]).Cast().ToList();
IList计数=(IList)多结果[1];

在这种情况下不需要使用Linq(of type()或.Cast)。 NHibernate实现就足够了

您只需使用:

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

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

是的,你可以!只需使用var result=Session.CreateCriteria(..).List()而不是og.List()。@stiank81:这是一个重复的问题。;)嗯,我明白;-)从您那里了解到这一点后,只需在joy中添加一条带有详细信息的注释。CreateMultiCriteria.List()没有列表。我明白了。
var results= query.List<>();