Каковы некоторые примеры, в которых деревья выражений полезны?

Я полностью понимаю концепцию деревьев выражений, но мне трудно найти ситуации, в которых они полезны. Есть ли конкретный экземпляр, в котором можно использовать деревья выражений? Или это полезно только в качестве транспортного механизма для кода? Я чувствую, что здесь что-то не хватает. Спасибо!

Ответ 1

Или это полезно только в качестве транспортного механизма для кода?

Он полезен как механизм выполнения для кода. Используя шаблон интерпретатор, деревья выражений могут быть непосредственно интерпретированы. Это полезно, потому что это очень легко и быстро реализовать. Такие интерпретаторы являются повсеместными и используются даже в случаях, которые, по-видимому, не "интерпретируют" что-либо, например. для печати вложенных структур.

Ответ 2

Некоторые unit test mocking frameworks используют деревья выражений, чтобы настроить строго типизированные ожидания/проверки. То есть:

myMock.Verify(m => m.SomeMethod(someObject)); // tells moq to verify that the method
                                              // SomeMethod was called with 
                                              // someObject as the argument

Здесь выражение никогда не выполняется, но само выражение содержит интересную информацию. Альтернативой без деревьев выражений будет

myMock.Verify("SomeMethod", someObject) // we've lost the strong typing

Ответ 3

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

Linq to SQL - хороший пример:

//a linq to sql statement
var recs (
    from rec in LinqDataContext.Table
    where rec.IntField > 5
    select rec );

Если бы у нас не было деревьев выражений, это утверждение должно было бы вернуть все записи, а затем применить логику С#, где каждая из них.

С деревьями выражений, что where rec.IntField > 5 может быть проанализирован в SQL:

--SQL statment executed
select *
from [table]
where [table].[IntField] > 5