На самом деле, это обход дерева выражений, которое вы передаете во вспомогательный метод, чтобы получить имена свойств.На практике это будет выглядеть примерно так:
MemberExpression memberExpression = (MemberExpression) expression.Body;
propertyName = memberExpression.Member.Name;
Конечно, это не завершено - например, вам придется пройтись по цепочке выражений, когда в выражении передано несколько вызовов свойств,вам придется учитывать другие типы выражений, которые передаются, кроме MemberExpression и т. д., и т. д., - но вы поняли идею.Помните, что выражение - это выражение кода, представленное в виде данных.Кроме того, поскольку MVC является открытым исходным кодом, вы можете найти точный код, который они используют, чтобы получить имя html в источниках, если хотите.
Чтобы ответить на ваш второй вопрос, ответ - нет.Передача «просто свойства» без лямбды (которая будет Expression<Func<T,object>>
) не будет работать, потому что тогда функция может видеть только переданное значение - и ничего о том, как вызывающий код достиг этого значения.