5

私は、多くのファーストクラスのコレクションを持つコード ベースで作業しています。

これらのコレクションを LINQ で使いやすくするために、次のようなコレクションごとの拡張メソッドがあります。

public static class CustomCollectionExtensions
{
    public static CustomCollection ToCustomCollection(this IEnumerable<CustomItem> enumerable)
    {
        return new CustomCollection(enumerable);
    }
}

付随するコンストラクターを使用すると、次のようになります。

public class CustomCollection : List<CustomItem>
{
    public CustomCollection(IEnumerable<CustomItem> enumerable) : base(enumerable) { }
}

IEnumerable<U>.To<T>()これはボイラープレートの束になってしまうため、これらの特定の 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;
    }
}

次のように呼び出す必要がありますcustomCollectionInstance.OrderBy(i => i.Property).To<CustomCollection, CustomItem>()

CustomItem代わりに使用できるように型を指定する必要を回避する方法はありますか、customCollectionInstance.OrderBy(i => i.Property).To<CustomCollection>()それとも一般的に実行できるものではありませんか?

4

1 に答える 1

5

あなたが望むものに近いもの:

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);
    }
}

使用法:

customCollectionInstance.OrderBy(i => i.Property).Convert().To<CustomCollection>();
于 2013-11-14T23:23:01.307 に答える