Альтернатива ExpressionHelper.GetExpressionText (Лямбда-выражение)

#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 заботится!