如何使用lambda表达式来获取属性“path”和值?

时间:2014-07-09 00:07:38

标签: c# asp.net-mvc lambda

我想做类似于HtmlHelpers在ASP.NET MVC中所做的事情。请采取以下措施:

@Html.EditorFor(model => model.SomeProperty.SomeInnerProperty)

HtmlHelper不仅可以清楚地获取SomeInnerProperty的值,而且还知道我称之为该属性的“路径”,因为它创建了具有属性的相应HTML元素:

name="SomeProperty.SomeInnerProperty"

我希望能够创建一个方法,可以同时获取值和“路径”,类似于HtmlHelper的方式。我对现有的HtmlHelpers进行了一些反思,看起来像是一个兔子洞。我已经能够创建一个像这样消耗它的方法:

MyCustomMethod(model => model.SomeProperty.SomeInnerProperty);

private void MyCustomMethod(Expression<Func<object, object>> expression)
{
    // I can inspect the expression object in the debugger here
}

在检查“表达”对象时,我可以通过反思来解决问题,但我不确定我的解决方案会有多强大,因为我只是通过观察来解决问题。此外,它似乎比它应该更难;就像我错过了一些简单的东西。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

获取完整路径:

expression.Body.ToString()将为您提供'model.SomeProperty.SomeInnerProperty'。获取第一个点后的子字符串以获取'SomeProperty.SomeInnerProperty'。

获取值:

expression.Compile().Invoke(modelObject);

答案 1 :(得分:1)

//basic
MemberExpression memberExpression = (MemberExpression) expression.Body;
string name = (memberExpression.Expression as MemberExpression).Member.Name;
name += "." + memberExpression.Member.Name;

//cycle
MemberExpression memberExpression = (MemberExpression) expression.Body;
string name = "";
while (memberExpression.Expression is MemberExpression)
{
    name = memberExpression.Member.Name + "." + name;
    memberExpression = (MemberExpression)memberExpression.Expression;
}