C# 多个级别的等效名称

C# 多个级别的等效名称,c#,asp.net-mvc,C#,Asp.net Mvc,在.cshtml页面中,我希望避免编写字符串,以便获得编译器对拼写错误的支持。我所追求的是相当于nameof,但不同。比如说, nameof(Three.Four.Five) // returns Five 但我想把“三,四,五”还给你。我已有以下资料: public static string FullHtmlFieldNameFor<T, TResult>(this HtmlHelper<T> html, Expression<Func<T, TResu

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

但是用法太忙了:
GetFieldName(x=>x.Three.Four.Five)
如果创建一个包含两个参数的帮助器会怎么样

public static string FullHtmlFieldNameFromFor<TBase, T, TResult>(this TBase obj, Func<TBase, T> _, Expression<Func<T, TResult>> expression) => ExpressionHelper.GetExpressionText(expression);
public静态字符串FullHtmlFieldNameFromFor(此TBase obj,Func,Expression Expression)=>ExpressionHelper.GetExpressionText(Expression);
然后您可以使用:

<label>@Html.FullHtmlFieldNameFromFor(x => x.One.Two, x => x.Three.Four.Five)</label>
@Html.FullHtmlFieldNameFromFor(x=>x.1.2,x=>x.3.4.5)
或者,如果为每个可能要用作名称基础的子类创建多个帮助器,该怎么办

public static string GetFieldName(Expression<Func<cTwo, object>> expression) => ExpressionHelper.GetExpressionText(expression);
public static string GetFieldName(Expression<Func<cThree, object>> expression) => ExpressionHelper.GetExpressionText(expression);
公共静态字符串GetFieldName(表达式)=>ExpressionHelper.GetExpressionText(表达式);
公共静态字符串GetFieldName(表达式)=>ExpressionHelper.GetExpressionText(表达式);

然后您可以使用每种解决方案。

您最后介绍的解决方案看起来不错。你是说你想通过
x.3.4.5而不是
x.1.2.3.4.5
。请参阅我的编辑。为什么需要将泛型类型传递到
GetFieldName
?C#应该能够从你的论点中推断出它们。或者,通过键入
x
将传递的lambda更改为
FullHtmlFieldNameFor
。顺便说一句,我在.Net中没有看到名为
FullHtmlFieldNameFor
的方法?@NetMage C#无法从本例中的参数推断出它们。试试看
FullHtmlFieldNameFor
是我在问题中展示的自己的方法。您需要指定
Two
的类型作为lambda参数:例如
(cTwo x)=>x.Three.Four.Five)
。。。
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);