#c# #.net #asp.net-mvc
#c# #.net #asp.net-mvc
Вопрос:
Существует ли альтернатива .NET Framework ExpressionHelper.GetExpressionText(LambdaExpression)
? Мне это нужно в некоторых проектах, которые не могут ссылаться на System.Web.Mvc.
Я понимаю, что одна из возможностей заключается в написании моей собственной реализации GetExpressionText(LambdaExpression)
метода, но я не хочу этого делать. Моя цель — повторно использовать уже существующий код .NET Framework.
Комментарии:
1. Что именно вам нужно? Не могли бы вы описать это, не ссылаясь на этот метод?
2. Этот метод возвращает имя свойства, которое указано в лямбда-выражении. Если вы знакомы с ASP.NET Тогда вы должны распознать это в MVC:
Html.TextBoxFor(model => model.ID)
. МетодTextBoxFor
использует ExpressionHelper для получения имени свойства (т. Е. «ID») и генерирует элемент управления с этим именем. Мне нужна та же функциональность: из выражения «x => x.SomeProperty» я должен получить «SomeProperty» в результате3. я не знаю альтернативы. FluentNHibernate, например, тоже реализовал свой собственный.
Ответ №1:
Реализовать этот метод самостоятельно довольно просто:
string GetPropertyName(LambdaExpression expression)
{
var body = (MemberExpression)expression.Body;
return body.Member.Name;
}
Если переданный лямбда-код не является MemberExpression
, он выдаст исключение (хотя вам может понадобиться более описательное исключение).
Если вы хотите вызвать метод напрямую, подобный GetPropertyName(x => x.ID)
, вам нужно было бы каким-то образом узнать, что это за тип x
. Одним из способов является параметр типа:
string GetPropertyName<T>(Expression<Func<T, object>> expression)
{
var body = (MemberExpression)expression.Body;
return body.Member.Name;
}
Но это означало бы, что вы должны указать это явно:
GetPropertyName<Foo>(f => f.Id)
Комментарии:
1. Извините, но вы внимательно прочитали мой вопрос? Как я уже писал «Я понимаю, что одна из возможностей заключается в написании моей собственной реализации… но я не хочу этого делать «. Я знаю, как писать методы такого типа, в худшем случае я использую Google. До сих пор @Firo давал лучший ответ в своем комментарии
2. И почему вы не хотите реализовать это самостоятельно? У вас есть какая-то причина для этого?
3. Потому что я хотел бы повторно использовать уже существующую функциональность. И, конечно, поддержка этого кода не будет моей проблемой.
4. Если он этого не сделает, я … поддержу за то, что он задал вопрос в первую очередь, даже если он не будет использовать ответ … поддержу за ответ DYI.
5. @svick ваш метод не заботится о сложных свойствах, таких как x=>x.propertyX.PropertyY, но ExpressionHelper.GetExpressionText заботится!