Получение текста выражения для лямбда-выражений - PullRequest
2 голосов
/ 16 сентября 2011

Я написал простой метод расширения для класса HtmlHelper, такой как

public static string GetExpressionNames<TModel>(this HtmlHelper<TModel> helper,params Expression<Func<TModel,object>>[] args) where TModel:class
        {
            string returnStr = string.Empty;
            int i = 0;
            foreach (var x in args) 
            {
                returnStr += (++i).ToString() + ExpressionHelper.GetExpressionText(x) + "<br/>";
            }
            return returnStr;
        }

В настоящее время он просто принимает массив LambdaExpressions, определенный в свойствах модели (возвращающий объект), и добавляет текст их выражения в строку, которая затемвозвращается этой функцией.Проблема в том, что для свойств строкового типа он работает нормально, но для свойств int он возвращает пустую строку в виде текста выражения.Причина в том, что для выражения, которое возвращает значения int, тело выражения выглядит следующим образом:

enter image description here

, но для строк это похоже на

enter image description here

Я думаю, что метод convert - это выражения, которые возвращают целочисленные значения, в результате чего пустая строка возвращается в виде текста выражения.Как я могу обойти эту проблему?Мне просто нужен оригинальный текст выражения, т.е. Id для Convert(x.id) и Name для x.Name;не имеет значения, как он обрабатывает его на заднем конце.

Ответы [ 2 ]

6 голосов
/ 16 сентября 2011

У меня есть этот метод расширения, чтобы сделать это для меня

public static string GetMemberName(this LambdaExpression expr) {
  var lexpr = expr;
  MemberExpression mexpr = null;
  if (lexpr.Body is MemberExpression) {
    mexpr = (MemberExpression) lexpr.Body;
  } else if (lexpr.Body is UnaryExpression) {
    mexpr = (MemberExpression) ((UnaryExpression) lexpr.Body).Operand;
  }
  if (mexpr == null) {
    return null;
  }
  return mexpr.Member.Name;
}

Возможно, вы захотите добавить дополнительные проверки, так как если Convert не содержит выражения, вы получите ошибку приведения.

1 голос
/ 16 сентября 2011

Ваш вопрос недостаточно полон, чтобы я знал, нужно ли вам обрабатывать более сложные сценарии (вызов метода, сложение и т. Д.), Но если вы просто ожидаете, что выражение будет содержать свойство, и вы просто хотите, чтобыимя свойства, вы можете написать код, который смотрит на Body самого лямбда-выражения.Если тело является выражением Convert, вы можете посмотреть на внутреннее выражение.Затем извлеките имя свойства из выражения MemberAccess внутри него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...