C# 我如何使用lambda表达式来获取属性";路径“;价值呢?

C# 我如何使用lambda表达式来获取属性";路径“;价值呢?,c#,asp.net-mvc,lambda,C#,Asp.net Mvc,Lambda,我想做一些类似于HTML帮助者在ASP.NET MVC中所做的事情。采取以下行动: @Html.EditorFor(model => model.SomeProperty.SomeInnerProperty) HtmlHelper不仅可以清楚地获取SomeInnerProperty的值,还可以知道我称之为该属性的“路径”,因为它创建了具有以下属性的适当HTML元素: name="SomeProperty.SomeInnerProperty" 我希望能够创建一个方法,该方法可以获得与Ht

我想做一些类似于HTML帮助者在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
}
MyCustomMethod(model=>model.SomeProperty.SomeInnerProperty);
私有void MyCustomMethod(表达式)
{
//我可以在这里检查调试器中的表达式对象
}
当检查“表达式”对象时,我可以通过反射来了解情况,但我不确定我的解决方案有多可靠,因为我只是通过观察来了解情况。此外,它只是看起来比它应该的更难;好像我错过了一些简单的事情


有什么想法吗?

要获得完整的路径:

expression.Body.ToString()
将为您提供“model.SomeProperty.SomeInnerProperty”。在第一个点后获取一个子字符串以获取“SomeProperty.SomeInnerProperty”

要获取值,请执行以下操作:

expression.Compile().Invoke(modelObject)

//基本
MemberExpression MemberExpression=(MemberExpression)expression.Body;
字符串名称=(memberExpression.Expression作为memberExpression).Member.name;
name+=“+”memberExpression.Member.name;
//循环
MemberExpression MemberExpression=(MemberExpression)expression.Body;
字符串名称=”;
while(memberExpression.Expression是memberExpression)
{
name=memberExpression.Member.name+“+name;
memberExpression=(memberExpression)memberExpression.Expression;
}

谢谢,@gp。我应该提到我见过expression.Body.ToString(),但我觉得解析它有点不像话,我不确定我能指望它。听起来我可以相信。我喜欢使用您的方法来获取value.Expression.ToString实现,使用ExpressionStringBuilder也会这样做。那么为什么不重用它而不是编写自己的实现呢…谢谢Alexandr。我应该提到,这将是一些通用代码,我不仅要处理model.SomeProperty.SomeInnerProperty,还要处理model.SomeProperty或model.SomeProperty.SomeInnerProperty.SomeInnerProperty。您的解决方案也是我通过观察发现的一部分,但它很有帮助,因为我不知道我可以轻松地将内容转换为MemberExpression来检查属性,而不是使用全反射。我需要寻找空值或其他值来确定深度。我想我更喜欢这个表达式,而不是@gp提到的expression.Body.ToString(),但是他/她帮助我获得了值。我会看看是否有更多的回答,但到目前为止,两个答案都应该打绿色的勾号。