【问题标题】:How can I use a lambda expression to get both the property "path" and the value?如何使用 lambda 表达式来获取属性“路径”和值?
【发布时间】: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
}

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

有什么想法吗?

【问题讨论】:

    标签: c# asp.net-mvc lambda


    【解决方案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() 更喜欢这个,但他/她帮助了如何获得价值。我会看看我是否会收到更多回复,但到目前为止,这两个答案都可能需要一个绿色的复选标记。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    相关资源
    最近更新 更多