如何使用 lambda 表达式来获取属性“路径”和值?
Posted
技术标签:
【中文标题】如何使用 lambda 表达式来获取属性“路径”和值?【英文标题】:How can I use a lambda expression to get both the property "path" and the value? 【发布时间】:2014-08-29 21:01:40 【问题描述】:我想做一些类似于 htmlHelpers 在 ASP.NET MVC 中所做的事情。采取以下措施:
@Html.EditorFor(model => model.SomeProperty.SomeInnerProperty)
HtmlHelper 不仅可以清楚地获取 SomeInnerProperty 的值,而且还知道我称之为该属性的“路径”,因为它创建了具有属性的适当 HTML 元素:
name="SomeProperty.SomeInnerProperty"
我希望能够创建一个可以同时获取值和“路径”的方法,类似于 HtmlHelpers 的做法。我对现有的 HtmlHelpers 做了一些反思,这看起来就像一个兔子洞。我已经能够创建一个像这样使用它的方法:
MyCustomMethod(model => model.SomeProperty.SomeInnerProperty);
private void MyCustomMethod(Expression<Func<object, object>> expression)
// I can inspect the expression object in the debugger here
在检查“表达式”对象时,我可以通过反射来解决问题,但我不确定我的解决方案会有多强大,因为我只是通过观察来解决问题。此外,它似乎比应有的更难;就像我错过了一些简单的东西。
有什么想法吗?
【问题讨论】:
【参考方案1】:获取完整路径:
expression.Body.ToString()
会给你'model.SomeProperty.SomeInnerProperty'。在第一个点之后获取一个子字符串以获取“SomeProperty.SomeInnerProperty”。
获取值:
expression.Compile().Invoke(modelObject);
【讨论】:
谢谢,@gp。我应该提到我已经看到了 expression.Body.ToString(),但是我觉得必须解析它有点脏,并且不确定我是否可以指望它。听起来我可以指望它。我喜欢你获得价值的方法。 Expression.ToString 实现使用 ExpressionStringBuilder referencesource.microsoft.com/#System.Core/Microsoft/Scripting/… 做同样的事情。那为什么不重用它而不是编写自己的实现......【参考方案2】://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;
【讨论】:
谢谢亚历山大。我应该提到这将是一些通用代码,我不仅要使用 model.SomeProperty.SomeInnerProperty,还要使用 model.SomeProperty 或 model.SomeProperty.SomeInnerProperty.SomeInnerInnerProperty。您的解决方案也是我通过观察发现的一部分,但它有助于我不知道我可以轻松地将事物转换为 MemberExpression 来检查属性与使用完全反射。我需要寻找空值或其他东西来确定要走多远。 我觉得我比@gp 提到的 expression.Body.ToString() 更喜欢这个,但他/她帮助了如何获得价值。我会看看我是否会收到更多回复,但到目前为止,这两个答案都可能需要一个绿色的复选标记。以上是关于如何使用 lambda 表达式来获取属性“路径”和值?的主要内容,如果未能解决你的问题,请参考以下文章