2011-11-10 14 views
7

¿Hay .NET Framework alternativa al ExpressionHelper.GetExpressionText(LambdaExpression)? Lo necesito en algunos de los proyectos que no pueden hacer referencia a System.Web.Mvc.ExpressionHelper.GetExpressionText (LambdaExpression) alternative

Entiendo que una de las posibilidades es escribir mi propia implementación del método GetExpressionText(LambdaExpression) pero no quiero hacerlo. Mi objetivo es reutilizar el código de .NET Framework ya existente.

+0

¿Qué es exactamente lo que necesita? ¿Podría describirlo sin hacer referencia a ese método? – svick

+0

Este método devuelve el nombre de la propiedad que se especifica en la expresión lambda. Si está familiarizado con ASP.NET MVC, debe reconocer esto: 'Html.TextBoxFor (model => model.ID)'. El método 'TextBoxFor' utiliza ExpressionHelper para obtener el nombre de la propiedad (es decir," ID ") y genera control con este nombre. Necesito la misma funcionalidad: de la expresión "x => x.SomeProperty" Tengo que obtener "SomeProperty" como resultado –

+1

sin otra alternativa que yo sepa. FluentNHibernate, por ejemplo, también implementó el suyo. – Firo

Respuesta

8

La implementación de este método a sí mismo es muy fácil:

string GetPropertyName(LambdaExpression expression) 
{ 
    var body = (MemberExpression)expression.Body; 
    return body.Member.Name; 
} 

Si el pasado-en lambda no es MemberExpression, será una excepción (aunque es posible que desee una excepción más descriptivo).

Si quiere llamar directamente al método como GetPropertyName(x => x.ID), debería saber de alguna manera qué tipo es x. Una forma es un parámetro de tipo:

string GetPropertyName<T>(Expression<Func<T, object>> expression) 
{ 
    var body = (MemberExpression)expression.Body; 
    return body.Member.Name; 
} 

Pero esto significaría que tiene que especificar explícitamente:

GetPropertyName<Foo>(f => f.Id) 
+0

Lo siento, pero ¿leyó mi pregunta con cuidado? Cuando escribí "entiendo que una de las posibilidades es escribir mi propia implementación ... pero no quiero hacerlo". Sé cómo escribir ese tipo de métodos, en el peor de los casos uso Google. Hasta ahora @Firo dio la mejor respuesta en su comentario –

+0

¿Y por qué no quieres implementarlo tú solo? ¿Tienes alguna razón para eso? – svick

+0

Porque me gustaría reutilizar la funcionalidad ya existente. Y, por supuesto, el soporte de este código no será mi problema. –