首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取lambda表达式的表达式文本

获取lambda表达式的表达式文本
EN

Stack Overflow用户
提问于 2011-09-16 22:04:22
回答 2查看 2K关注 0票数 2

我为HtmlHelper类编写了一个简单的扩展方法,比如

代码语言:javascript
复制
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数组,并将它们的表达式文本添加到一个字符串中,该字符串随后由该函数返回。问题是,对于string类型的属性,它工作得很好,但对于int属性,它将空字符串作为表达式文本返回。原因是对于返回int值的表达式,表达式的主体如下图所示:

但是对于字符串,它就像

我认为convert方法是返回整数值的表达式,导致空字符串作为表达式文本返回。我怎样才能解决这个问题呢?我只需要原始的表达式文本,即Convert(x.id)的Id和x.Name的名称;它在后端如何处理它并不重要。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-16 23:00:11

我有这个扩展方法来为我做这件事

代码语言:javascript
复制
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;
}

你可能需要考虑进行额外的检查,就好像转换不包含成员表达式一样,你会得到一个强制转换错误。

票数 6
EN

Stack Overflow用户

发布于 2011-09-16 22:11:34

你的问题还不够完整,我不知道你是否需要处理更复杂的场景(方法调用、添加等),但是如果你只是希望表达式包含一个属性,并且你只想要属性的名称,你可以编写代码来查看Body表达式本身。如果主体是一个Convert表达式,您可以查看内部表达式。然后从其中的MemberAccess表达式中提取属性的名称。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7445911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档