【问题标题】:Getting Expression Text for lambda Expressions获取 lambda 表达式的表达式文本
【发布时间】:2011-09-16 14:04:21
【问题描述】:

我已经为 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 值的表达式,表达式的主体如下图所示:

但对于字符串,它就像

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

【问题讨论】:

  • 所有表达式都是简单的还是嵌套的?即你总是期待 x=>x.Foo 吗?
  • 是的,我只期待简单的表达
  • 等一下,我会挖掘出我使用的功能

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


【解决方案1】:

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

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 不包含成员表达式,您将收到强制转换错误。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • @Muhammed:Bob Vale 的答案就是我的想法。随意接受他的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    相关资源
    最近更新 更多