繁体   English   中英

如何递归返回属性及其所有父项的反映名称

[英]How can I recursively return the reflected names of a property and all its parents

因此,我有以下帮助程序方法,该方法返回给定表达式的属性的名称。 它在MVC应用程序中用于根据需要绑定到的属性在视图中设置隐藏字段的ID。

public static string GetIDFromPropertyName<T>(Expression<Func<T>> exp)
{
   return (((MemberExpression)(exp.Body)).Member).Name;
}

但是我想要的是能够传递一个表达式,例如:

GetIDFromPropertyName(() => model.AComplexProperty.AnotherComplexProperty.ASimpleProperty)

并回到我身边:

AComplexProperty_AnotherComplexProperty_ASimpleProperty

我怎样才能做到这一点?

更新:为了清楚起见,我需要在服务器端而不是Razor中执行此操作。 最终传递给我的局部视图的模型将不包含属性本身,而只是具有ID的字符串属性(用于隐藏字段),因此无法使用内置的IdFor扩展

要从此GetIDFromPropertyName(() => aBCD)获取"B_C_D" ,可以使用以下代码:

public static string GetIDFromPropertyName<T>(Expression<Func<T>> exp)
{
    var members = new List<string>();
    GetIDFromPropertyName(exp.Body, members);
    // members contains {"D", "C", "B", "a"}

    // now simply return the appropiate result, example:
    members.RemoveAt(members.Count -1);
    members.Reverse();
    return members.Aggregate((s1, s2) => s1 + "_" + s2);
}
private static void GetIDFromPropertyName(Expression exp, List<string> members)
{
    var expression = exp as MemberExpression;
    if(expression != null)
    {
        var memberExpression = expression;
        members.Add(memberExpression.Member.Name);
        GetIDFromPropertyName(memberExpression.Expression, members);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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