Если вы используете тот же шаблон, что и метод LabelFor <>, то выражение всегда будет выражением LambdaExpression, и вы можете просто выполнить его, чтобы получить значение.
var result = ((LambdaExpression)expression).Compile().DynamicInvoke(model);
Как правило, вы можетевсегда оборачивайте обобщенные выражения в LambdaExpressions, а затем компилируйте и вызывайте их, чтобы получить значение.
Если то, что вы хотите, это не значение Forename, а само поле (например, распечатать строку «Forename») тогда ваш единственный вариант - это использовать какую-то форму экспрессионной ходьбы.В C # 4 платформа предоставляет класс ExpressionVisitor, который может использоваться для этого, но для более ранних версий платформы вы должны реализовать его самостоятельно - см .: http://msdn.microsoft.com/en-us/library/bb882521(VS.90).aspx