微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 更好地将IEnumerable转换为用户类型

我有一个自定义集合类型,这样定义:
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.

原文地址:https://www.jb51.cc/csharp/96587.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐