我有一个自定义集合类型,定义如下:
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>
. 不允许投射,我收到异常“无法从...投射”
这是我想出的答案,它确实有效,但它似乎有点笨重而且......过于复杂。也许不是,但我想我会把它拿出来看看是否有更好的方法。
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% 确定为什么会这样……但事实并非如此。感觉就像有一些我没有看到的非常明显的步骤......