В этом ответьте на вопрос о самом быстром способе определить, содержит ли свойство данный атрибут, пользователь Дарин Димитров полагали, что деревья выражений более безопасны, чем отражение. Это правда, и если да, то почему это правда?
Почему деревья выражений более безопасны, чем отражение?
Ответ 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 путь дерева выражений, похоже, проверяет тип.