Почему деревья выражений более безопасны, чем отражение?

В этом ответьте на вопрос о самом быстром способе определить, содержит ли свойство данный атрибут, пользователь Дарин Димитров полагали, что деревья выражений более безопасны, чем отражение. Это правда, и если да, то почему это правда?

Ответ 1

Потому что, когда вы ищете свое поле (как в этом вопросе), вы используете строковое представление "Id". Как только он изменится, ваше отражение рухнет.

Что предлагает Дарин, это статическая типизация:

Expression<Func<Program, int>> expression = p => p.Id;
Вы видите это? Это интересная, но не известная особенность компилятора С# 4.0: автоматически создайте дерево выражений из выражения лямбда и отбросите его до Expression<T> . Затем вы можете пройти его и получить MemberInfo Id. Но это не так универсально, как отражение, потому что вы не можете выполнить поиск string.

Ответ 2

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

Ответ заключается в том, что они оба, используя отражение.

Изменить для пояснения - MemberInfo.GetCustomAttributes - это вызов отражения.

http://msdn.microsoft.com/en-us/library/system.reflection.memberinfo.getcustomattributes(VS.71).aspx

Ответ 3

Из моего ограниченного знания .NET путь дерева выражений, похоже, проверяет тип.