简体   繁体   English

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM