Отражение на основе лямбда-выражения против нормального отражения

В чем разница между нормальным отражением и отражением, которое может быть сделано с помощью лямбда-выражений, таких как это (принятая форма создать собственный MVVM):

public void NotifyOfPropertyChange<TProperty>(Expression<Func<TProperty>> property)
{
    var lambda = (LambdaExpression)property;
    MemberExpression memberExpression;
    if (lambda.Body is UnaryExpression)
    {
        var unaryExpression = (UnaryExpression)lambda.Body;
        memberExpression = (MemberExpression)unaryExpression.Operand;
    }
    else memberExpression = (MemberExpression)lambda.Body;
    NotifyOfPropertyChange(memberExpression.Member.Name);
 }

Является ли отражение на основе лямбда просто использующим обычные API отражения? Или это нечто значительно другое. Какая разница в производительности?

Ответ 1

Цели сборки отражения, класс и структура интерфейса. Он дает доступ к определениям классов, сигнатурам методов, информации о типе и т.д. Он не обеспечивает доступ к коду методов, либо в абстрактном синтаксическом дереве (AST), либо в форме байт-кода.

Семейство типов Expression<> обеспечивает прямой доступ к AST, который может использоваться для сбора структуры фрагмента кода. Это гораздо ближе к объекту CodeDOM, чем к размышлению.