Я вижу одну вещь: в вашем коде, где вы вызываете метод FindAll, вы пытаетесь использовать переменную фильтра в качестве метода.Уберите Паренов ...
Я делаю такие вещи постоянно.На самом деле я написал несколько общих процессов, подобных этому.
Делегат поиска должен соответствовать Predicate, поэтому любой метод, который делает это, сделает это.Например, скажем, что вы хотите сделать что-то сумасшедшее, например использовать отражение для своего фильтра, вы можете сделать что-то вроде этого.
public class SimpleFind<T_Adaptor, T_Item>
{
public T_Adaptor AdapterItem { get; set; }
public SimpleFind(T_Adaptor item)
{
this.AdapterItem = item;
}
public bool FindMyStuff<T_Item>(T_Item value)
{
// Place your crazy reflection logic here...
if (value.Property == AdapterItem.Property) return true;
else return false;
}
}
Тогда ваш список будет использовать это так прямо:
List<T_ITem> items = myItems.Find(new SimpleFind<T_Adaptor, T_Item>(adapterValue).Find);
или в случае вашего метода, в котором вы передали предикат предиката, который уже определен:
List<T_ITem> items = myItems.Find(filter);
Я не скомпилировал это, и это всего лишь предположение, что два обобщенных типа имеют совпадающие значения, но я хотелпокажите эффект от того, как вы можете расширить это.
Однако, исходя из того, что я вижу в вашем коде, ваш фильтр должен работать, если вы удалите паренсы в вызове фильтра, поскольку он является делегатом в правильном шаблоне дляТип предиката.