c# – 更好地将IEnumerable转换为用户类型
发布时间:2020-12-15 17:41:45 所属栏目:百科 来源:网络整理
导读:我有一个自定义集合类型,这样定义: public abstract class RigCollectionBaseT : CollectionT,IEnumerableT,INotifyPropertyChanged,IBindingList,ICancelAddNew where T : BusinessObjectBase,new() 注意:这是基类,有20个左右的子类实现如下: public cla
我有一个自定义集合类型,这样定义:
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>.我正在寻找,是一个简单而简单的方法,从IEumberable< MyObject>返回MyCollection.铸造是不允许的,我得到例外“不能从…铸造” 这是我想出来的答案,它确实有效,但似乎有些笨拙和过于复杂.也许它不是,但我想我会得到这里,看看有没有一个更好的方法. 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%确定为什么是…但它不.只是觉得有一些非常明显的一步,我没有看到…. 解决方法
您的方法MakeRigCollection基本上是正确的方法.这是一个使用更简单的变体,但要简单实现:
TCollection MakeRigCollectionSimple<TCollection,TItem>( this IEnumerable<TItem> items,TCollection collection) where TCollection : ICollection<TItem> { foreach (var myObj in items) collection.Add(myObj); return collection; } 我希望我对了.你这样使用: MakeRigCollectionSimple(items,new MyCollection()); 要么 items.MakeRigCollectionSimple(new MyCollection()); 现在你有第二个参数填写,但作为交换,我们能够摆脱所有疯狂的泛型东西.只剩下简单的泛型类型推断完全踢.此外,这将适用于所有集合类型,而不仅仅是您的RigCollections. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |