У меня есть пользовательский тип коллекции, который определяется как таковой:
public abstract class RigCollectionBase<T> : Collection<T>, IEnumerable<T>, INotifyPropertyChanged, IBindingList, ICancelAddNew where T : BusinessObjectBase, new()
Примечание: это базовый класс, есть 20 или около того дочерних классов, которые реализованы так:
public class MyCollection : RigCollectionBase<MyObject>
В нашем коде мы используем много Linq, и, как вы, вероятно, знаете, функции Linq возвращают IEnumerable<T>
. Я ищу, это простой и простой способ вернуться к MyCollection
из IEumberable<MyObject>
. Кастинг не разрешен, я получаю исключение "Can not cast from..."
Вот ответ, который я придумал, и он действительно работает, но он кажется неудобным и... сложным. Может быть, это не так, но я решил, что я получу это там, чтобы увидеть, есть ли лучший способ.
public static class Extension
{
/// <summary>
/// Turn your IEnumerable into a RigCollection
/// </summary>
/// <typeparam name="T">The Collection type</typeparam>
/// <typeparam name="U">The Type of the object in the collection</typeparam>
/// <param name="col"></param>
/// <returns></returns>
public static T MakeRigCollection<T, U> (this IEnumerable<U> col) where T : RigCollectionBase<U>, new() where U : BusinessObjectBase, new()
{
T retCol = new T();
foreach (U myObj in col)
retCol.Add(myObj);
return retCol;
}
}
То, что я действительно ищу, я думаю, это. Есть ли способ реализовать базовый класс, чтобы я мог использовать простой прилив, чтобы перейти от IEnumerable в MyCollection...
var LinqResult = oldCol.Where(a=> someCondition);
MyCollection newCol = (MyCollection)LinqResult;
Нет, приведенный выше код не работает, и я на самом деле не на 100% уверен, почему это... но это не так. Он просто чувствует, что есть очень очевидный шаг, который я не вижу....