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

Kir*_*ohn 5 c# asp.net-mvc lambda

我想做一些类似于 HtmlHelpers 在 ASP.NET MVC 中所做的事情。采取以下措施:

@Html.EditorFor(model => model.SomeProperty.SomeInnerProperty)
Run Code Online (Sandbox Code Playgroud)

HtmlHelper 不仅可以清楚地获得 SomeInnerProperty 的值,而且还知道我称之为该属性的“路径”,因为它创建了具有属性的适当 HTML 元素:

name="SomeProperty.SomeInnerProperty"
Run Code Online (Sandbox Code Playgroud)

我希望能够创建一个方法,该方法可以获取类似于 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
}
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

gp.*_*gp. 2

获取完整路径:

expression.Body.ToString()会给你'model.SomeProperty.SomeInnerProperty'。获取第一个点后的子字符串以获取“SomeProperty.SomeInnerProperty”。

获取值:

expression.Compile().Invoke(modelObject);