从MemberExpression获取链接属性名称

3
我正在为MVC创建一个表单生成器,希望能够模拟Razor对链式属性的处理方式,具体如下:
builder.TextBoxFor(x => x.User.Email);

以下是类似于Razor的输出结果:
```html

这将以与Razor相同的方式产生以下输出:

```
<input id="User_Email" name="User.Email" type="textbox" />

以下代码适用于单层链接(例如x.Email生成Email),但我想检测最终属性之前是否有父级,然后使用递归返回链式结构(或至少向上移动一步)。
private static string GetFieldName<TModel, TProperty>(Expression<Func<TModel, TProperty>> expression)
{
    var memberExpression = (MemberExpression) expression.Body;
    return memberExpression.Member.Name;
}

我该如何调整代码,使得 x.User.Email 生成的是User.Email 而不仅仅是Email 呢?关键在于对属性的引用。

1个回答

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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接