Что означает выражение 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
Ответы
Ответ 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)) и должен также иметь конструктор по умолчанию.
ИЗМЕНИТЬ: см. ответ Джона ниже, он скорректировал подпись и правильно ответил на вопрос, предоставив больше информации, чем я.