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

时间:2011-09-16 14:04:22

标签: c# asp.net-mvc asp.net-mvc-3 c#-4.0 lambda

我为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;
        }

目前,它只是接受在Model属性(返回对象)上定义的LambdaExpressions数组,并将它们的表达式文本添加到一个字符串中,然后由该函数返回。问题是,对于字符串类型属性,它工作正常,但对于int属性,它将空字符串作为表达式文本返回。原因是对于返回int值的表达式,表达式主体看起来像下面的图像:

enter image description here

但是对于字符串,它就像

enter image description here

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

2 个答案:

答案 0 :(得分:5)

我有这个扩展方法为我做这个

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;
}

您可能需要考虑进行额外检查,就像转换不包含元素表示一样,您将收到强制转换错误。

答案 1 :(得分:1)

你的问题不够完整,我无法知道你是否需要处理更复杂的场景(方法调用,添加等),但是如果你只是期望表达式包含一个属性,而你只是想要属性的名称,您可以编写查看lambda表达式本身的Body的代码。如果正文是Convert表达式,则可以查看内部表达式。然后从该内的MemberAccess表达式中拉出属性的名称。