Я работаю в базе кода, в которой много коллекций первого класса.Универсальный метод расширения для преобразования из одной коллекции в другую
Для того, чтобы облегчить использование этих коллекций с помощью 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>()
или это не что можно сделать в целом?
Боюсь, что нет. – MarcinJuraszek
Почему именно у вас так много разных коллекций? Это похоже на запах кода для меня. – svick
@svick - существует множество коллекций, потому что это большая база кода, а коллекции первого класса были/предпочитаются коллекциями общих коллекций, чтобы где-то инкапсулировать правила на основе набора, а не определять их относительно общего IWhatever. Я не уверен, было ли это хорошим или плохим решением, но я знаю, что 'var a = Member.Offers.ActiveOffers()' выглядит немного чище, чем использовать .Where() каждый раз. –