2011-11-10 2 views
7

Y at-il .NET Framework alternative à ExpressionHelper.GetExpressionText(LambdaExpression)? J'en ai besoin dans certains projets qui ne peuvent pas référencer System.Web.Mvc.ExpressionHelper.GetExpressionText (LambdaExpression) alternative

Je comprends que l'une des possibilités est d'écrire ma propre implémentation de la méthode GetExpressionText(LambdaExpression) mais je ne veux pas le faire. Mon objectif est de réutiliser le code .NET Framework déjà existant.

+0

Que voulez-vous besoin? Pourriez-vous le décrire sans faire référence à cette méthode? – svick

+0

Cette méthode renvoie le nom de la propriété spécifiée dans l'expression lambda. Si vous connaissez ASP.NET MVC, vous devriez reconnaître ceci: 'Html.TextBoxFor (model => model.ID)'. La méthode 'TextBoxFor' utilise ExpressionHelper pour obtenir le nom de la propriété (c'est-à-dire," ID ") et génère un contrôle avec ce nom. J'ai besoin de la même fonctionnalité: à partir de l'expression "x => x.SomeProperty" je dois obtenir "SomeProperty" comme résultat –

+1

aucune alternative je sais. Par exemple, FluentNHibernate est également implémenté. – Firo

Répondre

8

La mise en œuvre de cette méthode vous est assez facile:

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

Si le passé dans lambda n'est pas MemberExpression, il jette une exception (bien que vous voudrez peut-être une exception plus descriptive).

Si vous souhaitez appeler la méthode directement comme GetPropertyName(x => x.ID), vous devez savoir en quelque sorte quel type est x. Une façon est un paramètre de type:

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

Mais cela voudrait dire que vous devez spécifier explicitement:

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

Je suis désolé, mais avez-vous lu attentivement ma question? Comme je l'ai écrit "je comprends que l'une des possibilités est d'écrire ma propre mise en œuvre ... mais je ne veux pas le faire". Je sais comment écrire ce type de méthodes, dans le pire des cas, j'utilise Google. Jusqu'à présent, @Firo a donné la meilleure réponse dans son commentaire –

+0

Et pourquoi ne voulez-vous pas l'implémenter par vous-même? Avez-vous une raison à cela? – svick

+0

Parce que je voudrais réutiliser des fonctionnalités déjà existantes. Et, bien sûr, le support de ce code ne sera pas mon problème. –