Это может быть просто, но, тем не менее, это вызвало у нас небольшую головную боль за последние несколько часов.
Короче говоря: нам нужно исправить утечку памяти, и способ сделать это - вернутьисходный список без создания нового экземпляра MyBindingList, если ToBindingList вызывается для списка, который уже имеет тип MyBindingList
MyBindingList наследует System.ComponentModel.BindingList
Как бы вы написали метод расширения ToBindingList() разрешает ли этот тест пройти?
[TestMethod]
public void FooBar()
{
var SUT = new MyBindingList<FooBar>
{
new FooBar{Name = "AAA"},
new FooBar{Name = "BBB"},
};
var filteredList = SUT.Where(x => x.Name == "AAA").ToBindingList();
Assert.AreEqual(1, filteredList.Count);
Assert.AreEqual(true, ReferenceEquals(filteredList, SUT));
}
private class FooBar
{
public string Name { get; set; }
}
Конструктор MyBindingList выглядит следующим образом
public class MyBindingList<T> : BindingList<T>, IEntityChanged
{
public MyBindingList(IList<T> list) : base(list) { }
//...
}
Проблема, с которой мы сталкиваемся, заключается в том, что метод расширения работает на итераторе (предложение Where), поэтомуу нас нет возможности сравнивать информацию типа двух списков.Мы написали следующий метод расширения, а затем стали мудрее - и застряли:
public static MyBindingList<T> ToBindingList<T>(this IEnumerable<T> container)
{
var returnVal = container as MyBindingList<T>;
if (returnVal != null)
return returnVal;
return new MyBindingList<T>(container.ToList());
}
Кто-нибудь может помочь нам найти жизнеспособное решение или объяснить, почему компилятор никогда не позволит нам сделать что-то подобное?
Заранее спасибо