Obtener el nombre de la propiedad de cadena de la expresión

Estoy tratando de escribir un ayudante fuertemente tipado que sería algo como esto:

Html.Lookup(x => x.FooId); 

Por ahora tengo esto:

 public static MvcHtmlString Lookup(this HtmlHelper html, Func expression) { // get string "FooId" here } 

¿Alguien sabe como conseguir esto?

 public static class ExpressionsExtractor { public static string Lookup(this HtmlHelper html, Expression> expression) { var memberExpression = expression.Body as MemberExpression; if (memberExpression == null) return null; return memberExpression.Member.Name; } } 

Entonces lo llamarías con:

 var propName = Html.Lookup(x => x.FooId); 

Otro código más.

 public MvcHtmlString Lookup(this HtmlHelper html, Expression> expression) { return MvcHtmlString.Create(ExpressionHelper.GetExpressionText(expression)); } 

Usa la clase ExpressionHelper. Func es delegado, Expresión es generar ExpressionTree en tiempo de comstackción. Expression.Compile () devuelve delegado, pero Func no obtiene ExpressionTree en tiempo de ejecución.

Actualmente estoy usando esta clase cuando necesito esta funcionalidad fuera del proyecto web donde no debería existir la referencia de System.Web.Mvc :

 namespace Interreg.Domain{ using System; using System.Linq.Expressions; public class PropertyName{ public static string For( Expression> expression){ var body=expression.Body; return GetMemberName(body); } public static string For( Expression> expression){ var body=expression.Body; return GetMemberName(body); } public static string GetMemberName( Expression expression){ if(expression is MemberExpression){ var memberExpression=(MemberExpression)expression; if(memberExpression.Expression.NodeType== ExpressionType.MemberAccess) return GetMemberName(memberExpression.Expression)+"."+memberExpression.Member.Name; return memberExpression.Member.Name; } if(expression is UnaryExpression){ var unaryExpression=(UnaryExpression)expression; if(unaryExpression.NodeType!=ExpressionType.Convert) throw new Exception(string.Format("Cannot interpret member from {0}",expression)); return GetMemberName(unaryExpression.Operand); } throw new Exception(string.Format("Could not determine member from {0}",expression)); } } } 

Lo bueno de esto es que no pierde puntos cuando va más allá de un solo nivel.

un poco tarde, pero estoy publicando una solución simple que funciona para mí en .Net 4. Tiene manejo para tipos de valor en la línea 4

 public PropertyInfo GetPropertyInfo(Expression> propertyLambda) { var member = propertyLambda.Body as MemberExpression; if (member == null) {// value types return Convert(x.property) which can't be cast to MemberExpression var expression = propertyLambda.Body as UnaryExpression; member = expression.Operand as MemberExpression; } return member.Member as PropertyInfo; }