nameof(order.User.Age)
只返回Age
而不是order.User.Age
为什么要用更严格的方式呢?如果我们只需要姓氏,我们可以做一些类似的事情
public static GetLastName(this string x) {
return string.Split(x, '.').Last();
}
nameof(order.User.Age).GetLastName()
使用一个操作符,我们可以同时得到Age
和order.User.Age
。但是在当前的实现中,我们只能得到Age
。这个决定背后有什么逻辑吗?例如,这种行为对于MVC绑定是必要的
Html.TextBox(nameof(order.User.Age))
6条答案
按热度按时间tnkciper1#
请注意,如果您需要/想要“完整”名称,您可以这样做:
只要所有这些名称都在当前作用域中。
显然,在这种情况下,它并没有那么有用(名称不在Razor调用的范围内),但是如果您需要,例如,调用
Type.GetType()
或其他东西的类型的完整命名空间限定名,它可能会有帮助。如果名称不在作用域中,您仍然可以执行更笨拙的操作:
--尽管可能至少有一个应该在范围内(除非
User.Age
是静态属性)。r1zhe5dt2#
我遇到了同样的问题,并实现了一个类,它作为
nameof()
关键字的替换,以获得所提供的表达式的全名。它受到OK HOSTING answer的极大启发。它只是全部烤好并准备用途:在代码中使用它看起来像这样:
snvhrwxg3#
正如你在已经链接的讨论中所读到的,这里你使用
nameof
运算符作为nameof(member-access)
,其形式为E.I<A1…AK>
,它将返回:这些情况都使用简单名称查找规则$7.6.2或成员访问规则$7.6.4解决。如果它们成功绑定,则必须绑定到以下之一:
所以在这种情况下,根据它的定义,它必须一步一步地评估所有点之前的所有表达式,然后评估最后一个表达式以获得它的
Name
:2hh7jdfx4#
看看这个方法,它来自:
https://github.com/okhosting/OKHOSTING.Data/blob/master/src/PCL/OKHOSTING.Data/Validation/MemberExpression.cs
6fe3ivhb5#
使用
nameof
的一些重要目的是获取表达式中的最后一个“名称”。例如抛出
ArgumentNullException
时的参数名称:MVC Action链接
INotifyPropertyChanged
更多信息:https://roslyn.codeplex.com/discussions/570551
628mspwn6#
.NET 6添加了CallerArgumentExpression,允许您创建
fullnameof
的解决方案版本。