如何以递归方式返回属性及其所有父项

时间:2015-06-22 14:47:24

标签: c# reflection

所以我有以下帮助器方法返回给定表达式的属性的名称。它在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扩展

1 个答案:

答案 0 :(得分:0)

从此"B_C_D"获取GetIDFromPropertyName(() => a.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);
    }
}