C# 用于从一个集合转换到另一个集合的泛型扩展方法

C# 用于从一个集合转换到另一个集合的泛型扩展方法,c#,generics,C#,Generics,我在一个拥有大量一流集合的代码库中工作 为了便于在LINQ中使用这些集合,每个集合都有一个扩展方法,如下所示: public static class CustomCollectionExtensions { public static CustomCollection ToCustomCollection(this IEnumerable<CustomItem> enumerable) { return new CustomCollection(en

我在一个拥有大量一流集合的代码库中工作

为了便于在LINQ中使用这些集合,每个集合都有一个扩展方法,如下所示:

public static class CustomCollectionExtensions
{
    public static CustomCollection ToCustomCollection(this IEnumerable<CustomItem> enumerable)
    {
        return new CustomCollection(enumerable);
    }
}
公共静态类CustomCollectionExtensions
{
公共静态CustomCollection到CustomCollection(此IEnumerable可枚举)
{
返回新的CustomCollection(可枚举);
}
}
与随行的施工人员:

public class CustomCollection : List<CustomItem>
{
    public CustomCollection(IEnumerable<CustomItem> enumerable) : base(enumerable) { }
}
公共类CustomCollection:列表
{
公共CustomCollection(IEnumerable可枚举):基(可枚举){}
}
这是一堆样板文件,因此我尝试编写一个通用的
IEnumerable.to()
,这样我们就不必一直生成这些特定的ToXCollection()方法

我得到的结果是:

public static class GenericCollectionExtensions
{
    public static T To<T, U>(this IEnumerable<U> enumerable) where T : ICollection<U>, new()
    {
        T collection = new T();
        foreach (U u in enumerable)
        {
            collection.Add(u);
        }
        return collection;
    }
}
公共静态类GenericCollectionExtensions
{
公共静态T To(此IEnumerable可枚举),其中T:ICollection,new()
{
T集合=新的T();
foreach(可枚举中的U)
{
收藏。添加(u);
}
回收;
}
}
必须像调用
customcollectionstance.OrderBy(i=>i.Property.to()


有没有一种方法可以避免必须指定
CustomItem
类型,这样我们就可以使用
customCollectionInstance.OrderBy(i=>i.Property).to()
或者这不是一般可以做的事情?

接近您想要的东西:

public static class GenericCollectionExtensions
{
    public sealed class CollectionConverter<TItem>
    {
        private readonly IEnumerable<TItem> _source;

        public CollectionConverter(IEnumerable<TItem> source)
        {
            _source = source;
        }

        public TCollection To<TCollection>()
            where TCollection : ICollection<TItem>, new()
        {
            var collection = new TCollection();
            foreach(var item in _source)
            {
                collection.Add(item);
            }
            return collection;
        }
    }

    public static CollectionConverter<T> Convert<T>(this IEnumerable<T> sequence)
    {
        return new CollectionConverter<T>(sequence);
    }
}
公共静态类GenericCollectionExtensions
{
公共密封类收集转换器
{
私有只读IEnumerable\u源;
公共收集转换器(IEnumerable源)
{
_来源=来源;
}
公共收集到()
其中TCollection:ICollection,new()
{
var collection=new TCollection();
foreach(来源中的var项)
{
集合。添加(项目);
}
回收;
}
}
公共静态CollectionConverter转换(此IEnumerable序列)
{
返回新的CollectionConverter(序列);
}
}
用法:

customCollectionInstance.OrderBy(i => i.Property).Convert().To<CustomCollection>();
customcollectionstance.OrderBy(i=>i.Property).Convert().To();

恐怕没有。为什么你们有这么多不同的收藏?对我来说,这看起来像是代码的味道。@svick-有很多集合,因为它是一个庞大的代码库,一类集合比泛型对象集合更有利于封装基于集合的规则,而不是相对于泛型IWhatever定义它们。我不确定这是一个好的决定还是一个坏的决定,但我知道
var a=Member.Offers.ActiveOffers()
看起来比每次都使用.Where()要干净一些。