[英]How can I use a lambda expression to get both the property “path” and the value?
I want to do something similar to what the HtmlHelpers do in ASP.NET MVC. 我想做一些类似于HtmlHelpers在ASP.NET MVC中所做的事情。 Take the following: 请考虑以下事项:
@Html.EditorFor(model => model.SomeProperty.SomeInnerProperty)
The HtmlHelper can clearly get not only the value for SomeInnerProperty, but it also knows what I call the "path" to that property because it creates the appropriate HTML element with an attribute: HtmlHelper不仅可以清楚地获取SomeInnerProperty的值,而且还知道我称之为该属性的“路径”,因为它创建了具有属性的相应HTML元素:
name="SomeProperty.SomeInnerProperty"
I want to do be able to create a method that can get both the value and the "path" similar to how the HtmlHelpers do. 我想能够创建一个方法,可以获得类似于HtmlHelper的值和“路径”。 I did a little reflection into the existing HtmlHelpers and that looked like quite a rabbit hole. 我对现有的HtmlHelpers进行了一些反思,看起来像是一个兔子洞。 I have been able to create a method that consumes it like so: 我已经能够创建一个消耗它的方法,如下所示:
MyCustomMethod(model => model.SomeProperty.SomeInnerProperty);
private void MyCustomMethod(Expression<Func<object, object>> expression)
{
// I can inspect the expression object in the debugger here
}
When inspecting the "expression" object, I can figure things out through reflection, but I'm not sure how robust my solution would be because I am just figuring things out through observation. 在检查“表达”对象时,我可以通过反思来解决问题,但我不确定我的解决方案会有多强大,因为我只是通过观察来解决问题。 In addition, it just seems harder than it should be; 此外,它似乎比它应该更难; like I am missing something simple. 就像我错过了一些简单的事情。
Any ideas? 有任何想法吗?
To get the complete path: 要获得完整的路径:
expression.Body.ToString()
will give you 'model.SomeProperty.SomeInnerProperty'. expression.Body.ToString()
将为您提供'model.SomeProperty.SomeInnerProperty'。 Get a substring after first dot to get 'SomeProperty.SomeInnerProperty'. 获取第一个点后的子字符串以获取'SomeProperty.SomeInnerProperty'。
To get the value: 要获得价值:
expression.Compile().Invoke(modelObject);
//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; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.