C# 如何递归返回属性及其所有父级的反射名称

C# 如何递归返回属性及其所有父级的反射名称,c#,reflection,C#,Reflection,因此,我有下面的helper方法,它返回给定表达式的属性的名称。它在MVC应用程序中用于根据需要绑定的属性设置视图中隐藏字段的ID public static string GetIDFromPropertyName<T>(Expression<Func<T>> exp) { return (((MemberExpression)(exp.Body)).Member).Name; } 回到我身边: AComplexProperty_AnotherCom

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

public static string GetIDFromPropertyName<T>(Expression<Func<T>> exp)
{
   return (((MemberExpression)(exp.Body)).Member).Name;
}
回到我身边:

AComplexProperty_AnotherComplexProperty_ASimpleProperty
我该怎么做

更新:为了清楚起见,我需要在服务器端执行此操作,而不是在Razor中。最终传递给我的局部视图的模型将不包含属性本身,只包含ID用于隐藏字段的字符串属性,因此不能使用内置的IdFor扩展来从此
GetIDFromPropertyName(()=>a.B.C.D)获取
“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);
    }
}
公共静态字符串GetIDFromPropertyName(表达式exp)
{
var members=新列表();
GetIDFromPropertyName(exp.Body,成员);
//成员包含{“D”、“C”、“B”、“a”}
//现在只需返回适当的结果,例如:
members.RemoveAt(members.Count-1);
成员。反向();
返回成员。聚合((s1,s2)=>s1+“”+s2);
}
私有静态void GetIDFromPropertyName(表达式表达式表达式,列表成员)
{
var expression=exp作为MemberExpression;
if(表达式!=null)
{
var memberExpression=表达式;
添加(memberExpression.Member.Name);
GetIDFromPropertyName(memberExpression.Expression,成员);
}
}

如中所述,有一个内置的帮助程序。为了更清楚,我需要从服务器端执行此操作。在视图中传递的模型不包含属性本身,它只包含一个字符串属性,它使用该属性设置为字段ID和名称。那么,您能用这些详细信息扩展问题吗?当前,您似乎希望从嵌套模型表达式生成输入id,IdFor()帮助程序正是这样做的。更新了questionwell后,您需要在视图中以外的位置执行此操作,这看起来很奇怪(应该知道如何呈现内容的是视图,而不是模型/控制器)。但如果您想这样做,可以查看MVC源代码,了解它如何生成ID。如下所示:string id=(new TemplateInfo()).getFullHtmlFieldDid(ExpressionHelper.GetExpressionText(exp));
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);
    }
}