从 MemberExpression 获取链接属性名称

Sav*_*age 3 c# linq

我正在为 MVC 创建一个表单生成器,我想通过以下方式模拟 Razor 对链式属性的处理:

builder.TextBoxFor(x => x.User.Email);
Run Code Online (Sandbox Code Playgroud)

它将以与 Razor 相同的方式生成以下内容:

<input id="User_Email" name="User.Email" type="textbox" />
Run Code Online (Sandbox Code Playgroud)

以下代码适用于单级链接(例如x.EmailProduce Email),但我试图检测最终属性之前何时存在父级,然后使用递归返回链(或至少向上一级) 。

private static string GetFieldName<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression)
{
    var memberExpression = (MemberExpression) expression.Body;
    return memberExpression.Member.Name;
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能适应这个,以便x.User.Email产生User.Email而不是像Email现在这样?

Den*_*nis 5

你需要一点递归:

private static string GetPropertyPath<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression)
{
    var propertyPath = new Stack<string>();
    var body = (MemberExpression)expression.Body;

    do
    {
        propertyPath.Push(body.Member.Name);

        // this will evaluate to null when we will reach ParameterExpression (x in "x => x.Foo.Bar....")
        body = body.Expression as MemberExpression;
    }
    while (body != null);

    return string.Join(".", propertyPath);
}
Run Code Online (Sandbox Code Playgroud)