Можно ли построить коллекцию Func - PullRequest
1 голос
/ 13 марта 2020

Я пытаюсь настроить набор динамических c фильтров для внедрения в мой объект ORM во время выполнения (по одному для каждого типа сущности), поэтому я пытаюсь сделать что-то вроде этого:

Filters = new List<Action>
{
    (Foo f) => ...,
    (Bar b) => ...,
    (Goo g) => ...,
};

Тогда, когда пользователь делает что-то вроде:

var tSet = db.GetAll<T>().Where(...).ToArray();

Я бы реализовал GetAll (), например:

public IQueryable<T> GetAll<T>() where T : class
{
    using var db = Connection.Open();
    var filter = Filters.FirstOrDefault(f => f.GetType() == typeof(Func<T, bool>)) as Func<T, bool>;

    return (FiltersEnabled && filter != null) ? db.Select<T>().Where(filter) : db.Select<T>();
}

Можно ли каким-то образом сохранить List<Func<variousT, bool>> как Я не могу заставить эту работу? Я пытался объявить это как:

protected ICollection<object> Filters = new List<object>();

, но это не сработало, и, очевидно, я не могу использовать делегатов Action из-за различий в сигнатурах.

1 Ответ

3 голосов
/ 13 марта 2020

Поскольку все ваши делегаты принадлежат к разным типам, вам необходимо объявить коллекцию так, чтобы она содержала тип base : Delegate:

List<Delegate> filters = new List<Delegate>
{
    (Func<int, bool>)(i => i > 0),
    (Func<string, bool>)(s => s.Length > 0)
};

Явное приведение к Func необходим, потому что компилятор не может автоматически преобразовывать лямбда-выражение в Delegate.

...