У меня есть класс, который хочет IList<T>
, но у меня есть Systems.Collection.IList
, исходящий из NHibernate quere.
Я хочу создать метод, который преобразует его в IList<T>
. Как это сделать?
У меня есть класс, который хочет IList<T>
, но у меня есть Systems.Collection.IList
, исходящий из NHibernate quere.
Я хочу создать метод, который преобразует его в IList<T>
. Как это сделать?
Если вы уверены, что все элементы наследуются от 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
приведет к дополнительной копии списка, что может иметь неблагоприятные последствия для производительности.
Лучшим (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
}
Это будет иметь преимущество не создавать другую копию всего списка.
Один из способов - использовать Linq, например list.OfType<T>()
или .Cast<T>()
IList multiResults = session.CreateMultiCriteria()
.Add(pageCriteria)
.Add(countCriteria)
.List();
В приведенном выше вызове нет возможности вернуть типизированный список. Поэтому он должен быть заброшен, как указано выше, например:
IList<T> results = ((IList)multiResults[0]).Cast<T>().ToList();
IList counts = (IList)multiResults[1];
Не можете ли вы добиться того, что NHibernate вернет вам IList?
Интерфейс ICriteria определяет метод List<T>
...
Фредерик прав, NHibernate уже делает это.
var data = query.List<MyType>();
Это приведет к IList указанного вами типа. В этом случае IList<MyType>
.
В этом случае нет необходимости использовать Linq (OfType() или .Cast). Реализации NHibernate достаточно.
Вам просто нужно использовать:
var results= query.List<YourType>();
вместо
var results= query.List<>();