2011-11-10 11 views
7

Czy istnieje .NET Framework alternatywa dla ExpressionHelper.GetExpressionText(LambdaExpression)? Potrzebuję go w niektórych projektach, które nie mogą odwoływać się do System.Web.Mvc.ExpressionHelper.GetExpressionText (LambdaExpression) alternatywa

Rozumiem, że jedną z możliwości jest napisanie własnej implementacji metody GetExpressionText(LambdaExpression), ale nie chcę tego robić. Moim celem jest ponowne wykorzystanie już istniejącego kodu .NET Framework.

+0

Co dokładnie jest potrzebne? Czy możesz opisać to bez odwoływania się do tej metody? – svick

+0

Ta metoda zwraca nazwę właściwości określonej w wyrażeniu lambda. Jeśli znasz ASP.NET MVC, powinieneś rozpoznać to: 'Html.TextBoxFor (model => model.ID)'. Metoda 'TextBoxFor' używa ExpressionHelper, aby uzyskać nazwę właściwości (tj." ID ") i generuje sterowanie o tej nazwie. Potrzebuję tej samej funkcjonalności: od wyrażenia "x => x.SomeProperty" Muszę uzyskać "SomeProperty" w wyniku czego –

+1

nie znam żadnej alternatywy. FluentNHibernate na przykład zaimplementował swój własny. – Firo

Odpowiedz

8

Implementacja tej metody sam jest dość proste:

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

Jeśli przekazywana w lambda nie jest MemberExpression, będzie to wyjątek (choć może chcesz wyjątek bardziej opisowy).

Jeśli chcesz wywołać metodę bezpośrednio, jak GetPropertyName(x => x.ID), musisz wiedzieć, jaki jest typ x. Jednym ze sposobów jest parametrem typu:

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

Ale oznaczałoby to trzeba określić go jednoznacznie:

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

Przykro mi, ale czy dokładnie przeczytałeś moje pytanie? Jak napisałem: "Rozumiem, że jedną z możliwości jest napisanie własnej implementacji ... ale nie chcę tego robić". Wiem, jak pisać takie metody, w najgorszym przypadku używam Google. Do tej pory @Firo dał najlepszą odpowiedź w swoim komentarzu –

+0

A dlaczego nie chcesz go wdrożyć samodzielnie? Czy masz jakiś powód? – svick

+0

Ponieważ chciałbym ponownie wykorzystać istniejącą już funkcjonalność. Oczywiście obsługa tego kodu nie będzie moim problemem. –