How can I use a lambda expression to get both the path property and the value?

I want to do something similar to what HtmlHelpers does in ASP.NET MVC. Take the following:

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

HtmlHelper can explicitly get not only a value for SomeInnerProperty, but also knows what I call the "path" to this property, because it creates the corresponding HTML element with the attribute:

name="SomeProperty.SomeInnerProperty"

I want to make a way to create a method that can receive both a value and a "path", similar to how HtmlHelpers does it. I was thinking a bit about the existing HtmlHelpers, and it was like a rabbit hole. I was able to create a method that consumes it like this:

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

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

"", , , , , . , , ; - .

?

+4
2

:

expression.Body.ToString() "model.SomeProperty.SomeInnerProperty". , "SomeProperty.SomeInnerProperty".

:

expression.Compile().Invoke(modelObject);

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

Source: https://habr.com/ru/post/1547672/


All Articles