Подтвердить что ты не робот

Что означает выражение Expression <Func <T, bool >>?

Может ли кто-нибудь объяснить следующее объявление таким образом, чтобы передать смысл выражения и как он будет вызван?

void Delete<T>(Expression<Func<T, bool>> expression) where T : class, new();

Я читал это как: Удалите объект типа T, передав в выражении лямбда, параметр которого является объектом типа T, который возвращает bool.

Кроме того, вы можете заменить   Func<T, bool> expression с   Predicate<T> expression

4b9b3361

Ответ 1

Этот метод, вероятно, является членом типа коллекции, да?

"Предикат" - это любое устройство, которое говорит "да" или "нет" на вопрос "эта вещь является членом этого набора?". Таким образом, предикат для множества "целые числа даже положительные целые" будет x=> x > 0 && x % 2 == 0.

Этот метод, вероятно, имеет семантику "удалить из коллекции все члены коллекции, которые находятся в наборе, идентифицированном предикатом".

Предикат передается методу в виде дерева выражений, который является способом передачи структуры предиката способом, который может быть проанализирован во время выполнения и преобразован. Он обычно используется в сценариях, где "сбор" на самом деле является базой данных где-то, и запрос удаления должен быть переведен в запрос на языке запросов базы данных и отправлен по сети.

Ответ 2

Первый - это метод, который принимает дерево выражений (не обязательно созданное из дерева лямбда-выражения). Дерево выражений представляет собой выражение, которое принимает T и возвращает a bool. T ограничивается ссылочным типом без конструктора без параметров.

Что касается семантического значения - это до документации/реализации.

Важно различать лямбда-выражение, которое является одним из способов создания дерева выражений и самого дерева выражений.

А может ли он использовать Predicate<T> - возможно. Это зависит от того, что с ним происходит. Они представляют собой одну и ту же подпись делегата, конечно, но вы не можете преобразовать между двумя типами дерева выражений тривиально.

Ответ 3

эти методы получают в качестве параметра дерево выражений для функции, которая получает объект с открытым конструктором без параметров и возвращает boolean.

вы можете больше узнать о деревьях выражений и их использовании здесь: http://msdn.microsoft.com/en-us/library/bb397951.aspx

Ответ 4

Пока подпись метода выглядит недействительной для меня, вы, по сути, передаете в дереве выражений (это может быть не тип LambdaExpression, так как Expression является абстрактным базовым классом для всех типов выражений).

Ограничения типа указывают, что T должен быть ссылочным типом (наследовать от класса, не может быть типом значения (read: struct)) и должен также иметь конструктор по умолчанию.

ИЗМЕНИТЬ: см. ответ Джона ниже, он скорректировал подпись и правильно ответил на вопрос, предоставив больше информации, чем я.