Подтвердить что ты не робот

Как преобразовать non-Generic IList в IList <T>?

У меня есть класс, который хочет IList<T>, но у меня есть Systems.Collection.IList, исходящий из NHibernate quere.

Я хочу создать метод, который преобразует его в IList<T>. Как это сделать?

4b9b3361

Ответ 1

Если вы уверены, что все элементы наследуются от T (или любого другого типа, который вы используете)

IList<T> myList = nonGenericList.Cast<T>().ToList();

Если вы не уверены:

IList<T> myList = nonGenericList.OfType<T>().ToList();

Конечно, вам понадобится пространство имен System.Linq:

using System.Linq;

Ответ 2

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
}

Это будет иметь преимущество не создавать другую копию всего списка.

Ответ 3

Один из способов - использовать Linq, например list.OfType<T>() или .Cast<T>()

Ответ 4

Фредрик прав. Но Nhibernate также имеет возможность возвращать несколько наборов результатов. Например:
  IList multiResults = session.CreateMultiCriteria()
                .Add(pageCriteria)
                .Add(countCriteria)
                .List();

В приведенном выше вызове нет возможности вернуть типизированный список. Поэтому он должен быть заброшен, как указано выше, например:

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

Ответ 5

Не можете ли вы добиться того, что NHibernate вернет вам IList? Интерфейс ICriteria определяет метод List<T>...

Ответ 6

Фредерик прав, NHibernate уже делает это.

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

Это приведет к IList указанного вами типа. В этом случае IList<MyType>.

Ответ 7

В этом случае нет необходимости использовать Linq (OfType() или .Cast). Реализации NHibernate достаточно.

Вам просто нужно использовать:

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

вместо

var results= query.List<>();