首页 > 解决方案 > 多个级别的等效名称

问题描述

在一个.cshtml页面中,我想避免编写字符串,以便获得编译器对拼写错误的支持。我所追求的是等价nameof但不同的。例如,

nameof(Three.Four.Five) // returns Five

但我想退回“三.四.五”。我已经有以下内容:

public static string FullHtmlFieldNameFor<T, TResult>(this HtmlHelper<T> html, Expression<Func<T, TResult>> expression)
{
    return html.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression));
}

我使用但这是不同的,因为我这样使用它:

<label>@Html.FullHtmlFieldNameFor(x=> x.One.Two.Three.Four.Five)</label>

如您所见,上面将返回“One.Two.Three.Four.Five”,但我希望名称为“Three.Four.Five”。我正在考虑在上面添加另一个参数来指定从表达式返回多少级别。例如,3 将返回“Three.Four.Five”,但使用它会是这样的:

<label>@Html.FullHtmlFieldNameFor(x=> x.One.Two.Three.Four.Five, 3)</label>

但我不喜欢这样,因为当您阅读代码时,您仍然会看到“One.Two.Three.Four.Five”,而且标签似乎是“One.Two.Three.Four.Five”。

问题

我怎样才能通过Three.Four.Five或像x => x.Three.Four.Five上述场景中的表达式?

编辑

我什至创建了这个方法:

public static string GetFieldName<T, TResult>(Expression<Func<T, TResult>> expression)
{
    return ExpressionHelper.GetExpressionText(expression);
}

但使用太忙:GetFieldName<Two, int>(x => x.Three.Four.Five)

标签: c#asp.net-mvc

解决方案


如果您创建一个带有两个参数的助手会怎样?

public static string FullHtmlFieldNameFromFor<TBase, T, TResult>(this TBase obj, Func<TBase, T> _, Expression<Func<T, TResult>> expression) => ExpressionHelper.GetExpressionText(expression);

然后你可以使用:

<label>@Html.FullHtmlFieldNameFromFor(x => x.One.Two, x => x.Three.Four.Five)</label>

或者,如果您为每个子类创建多个帮助器,您可能希望将其用作名称基础,该怎么办?

public static string GetFieldName(Expression<Func<cTwo, object>> expression) => ExpressionHelper.GetExpressionText(expression);
public static string GetFieldName(Expression<Func<cThree, object>> expression) => ExpressionHelper.GetExpressionText(expression);

然后你可以使用每一个。


推荐阅读