2011-09-16 307 views
2

我已经写一个简单的扩展方法,用于HtmlHelper类等lambda表达式

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

我想转换方法是表达式返回integar值导致空字符串作为表达式文本返回。我怎样才能解决这个问题?我只需要原始表达文本,即Id为Convert(x.id),Name为x.Name;无论它在后端如何处理它都无关紧要。

+0

你的所有表情都会变得简单还是会嵌套?即你是否总是期待x => x.Foo? –

+0

是的我只是期待简单的表达 –

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

你可能要考虑把额外的检查,就好像转换不containt一个memberexpression你会得到一个错误投。

+0

感谢鲍勃,非常感谢 –

1

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

+0

可以üPLZ显示如何在代码中做到这一点? –

+0

@穆罕默德:鲍勃·瓦尔的答案就是我的想法。随时接受他的。 – StriplingWarrior