【发布时间】:2019-10-21 22:18:30
【问题描述】:
我的班级需要 IList<T>,但我有一个来自 NHibernate quere 的 Systems.Collection.IList。
我想创建一个将其转换为IList<T> 的方法。我该怎么做?
【问题讨论】:
标签: c#
我的班级需要 IList<T>,但我有一个来自 NHibernate quere 的 Systems.Collection.IList。
我想创建一个将其转换为IList<T> 的方法。我该怎么做?
【问题讨论】:
标签: c#
如果您确定所有元素都继承自 T(或您使用的任何类型)
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 会产生一个额外的列表副本,这可能会对性能产生不利影响。
更好的(恕我直言)方法是创建一个包装类并即时进行转换。你想要这样的东西:
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>()
【讨论】:
你不能实现 NHibernate 返回一个 IList 吗?
ICriteria 接口定义了一个List<T> 方法...
【讨论】:
Frederik 是正确的,NHibernate 已经这样做了。
var data = query.List<MyType>();
这将产生您指定类型的 IList。在这种情况下IList<MyType>。
【讨论】:
在这种情况下不需要使用 Linq(OfType() 或 .Cast)。 NHibernate 实现就足够了。
你只需要使用:
var results= query.List<YourType>();
而不是
var results= query.List<>();
【讨论】: