c# - 获取 lambda 表达式的表达式文本

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

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

enter image description here

但是对于字符串,它就像

enter image description here

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

最佳答案

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

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 不包含 memberexpression 一样,您将得到一个转换错误。

关于c# - 获取 lambda 表达式的表达式文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7445911/

相关文章:

c# - MsChart 部分更新而不是 c# 中的完全刷新

c# - 获取 Entity Framework 中每个组的最后记录?

asp.net-mvc - MVC Web 应用程序应该是 3 层吗?

javascript - 添加到可观察数组时, knockout 模板不会更新列表

asp.net-mvc-3 - 将文本附加到 Razor 中的 MvcHtmlString

c# - IDbCommand 是否从实现 IDisposable 的类中被释放?

c# - Azure Devops 上的 Net Core 3.0 SDK Preview 9 的 Visual Studio 构建失败

c# - 加速 ASP MVC 单元测试

asp.net-mvc-3 - 似乎无法使用Razor的foreach和if语句有条件地创建新表行吗?

ASP.NET MVC - 如何将子站点 (ASP.NET) 添加到我的应用程序?