问题标签 [nameof]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
1546 浏览

c# - Object.GetType() 也返回项目名称

尝试覆盖 ToString() 并使用 GetType() 返回正在使用的对象的类型。它正在返回信息,但它包括名称空间。问题是如何剥离 NameSpace 并只显示对象名称。这是我的代码:

0 投票
7 回答
12844 浏览

c# - nameof 和 typeof 的区别

如果我错了,请纠正我,但是做类似的事情

应该给你完全相同的输出。根据此来源,可以理解的原因之一是:https ://msdn.microsoft.com/en-us/library/dn986596.aspx是

“使用 nameof 有助于在重命名定义时保持代码有效”

如果您想将类实例作为字符串获取,则无法执行以下操作:

但是,您可以执行以下操作:

在这两种情况下 (typeofnameof) 都可以进行重构,因此我看不出有任何其他原因需要重新发明另一个更高级别的关键字,例如nameof,以执行已经存在的某些事情。它们之间有什么我看不清楚的区别吗?

最后,如果有人能指出一个参考源来看看nameof. 它使用反射吗?

更新 1: 取自这里

nameof显然与声明字符串变量一样有效。没有反射或任何东西!

当您查看生成的 MSIL 时,您会看到它等同于字符串声明,因为使用 ldstr 运算符将对字符串的对象引用推入堆栈:

0 投票
2 回答
195 浏览

c# - c#中使用nameof获取setter方法名

是否可以使用 newnameof运算符获取 setter 方法名称?

我想 GetType().GetMethod("set_" + nameof(Foo))可以工作,但有什么更简单的吗?

0 投票
1 回答
1535 浏览

c# - 在不指定类型参数的情况下对泛型类的成员使用 nameof

我想将 Bar 的名字传递给Type.GetMethod(string). 我可以这样做someType.GetMethod(nameof(Foo<int>.Bar)),但这int在这里完全是任意的;有什么办法可以省略吗?可悲的是,nameof(Foo<>.Bar)不起作用。

在这个玩具案例中这没什么大不了的,但是如果有多个类型参数,特别是如果它们where附加了约束,那么将它们全部拼出来可能会成为一项任务。

0 投票
1 回答
951 浏览

c# - 在静态字段初始化程序中使用非静态字段的名称

我有一个带有静态List<T>和一些非静态字段的类。现在我想用一些像这样的对象来初始化这个列表:

虽然创建第一个Foo对象工作正常,但我得到了错误

字段初始值设定项不能引用非静态字段、方法或属性 C.bar

在第二个。

我知道静态成员无法访问实例数据(请参阅此问题)。但据我了解,nameof在编译时进行评估并且只访问元数据而不是实例数据。那么为什么这不起作用,有没有办法呢?

0 投票
1 回答
324 浏览

c# - 为什么 nameof() 在 Linq 表达式中给出一个模棱两可的调用警告,但当我使用与字符串相同的值时却没有?

当我升级到 FluentAssertions 4.2.2 时,我收到了一个编译器警告。在下面的代码中,如果我调用EndsWith(nameof(x)),我会收到一个模棱两可的调用警告。相反,如果我定义var foo = nameof(x)并调用EndsWith(foo),它会干净地编译。代码在两种情况下都可以正常运行。

nameof()我的问题是为什么会发生这种情况,除了将结果存储在变量中之外,还有其他解决方法吗?

0 投票
1 回答
263 浏览

c# - 将“nameof”关键字与仅设置属性一起使用

在我的函数中,我收到实现IMediaPanel接口的对象:

在初始化期间,我需要指定属性的名称,为此我使用 C# 6.0nameof关键字:

这很好用,但是使用以下表达式:

Visual Studio 向我显示以下错误:

'MyNamespace.IMediaPanel.IsNextEntityExists' 属性没有 getter。

搜索“限制名称”没有给我任何关于这个问题的答案,而且官方评论不包含关于属性获取器的限制:

... 以下是值得一提的产生错误的类型:预定义类型(例如,int 或 void)、可空类型(Point?)、数组类型(Customer[,])、指针类型(Buffer*)、限定别名(A ::B) 和未绑定的泛型类型 (Dictionary<,>)、预处理符号 (DEBUG) 和标签 (loop:)。...

谁能解释为什么有这个限制,是否有任何参考?什么原因可以强制nameof关键字使用属性的实例获取器,而它应该(我猜)只是通过反射使用一般类型信息?(至少在这种特殊情况下,当我由于未知类型而无法直接指向实例的属性时,我只知道该实例实现了接口)

更新

为了解释为什么@Gusdor 的评论建议不起作用,我需要澄清我如何调用InitConnections函数(以简化形式):

因此,如果我nameof(panelControl.IsNextEntityExists)Init函数中使用,则会产生错误,因为 FrameworkElement 不包含自定义客户端的IsNextEntityExists属性。如果我在InitConnections函数中使用相同的表达式,我会收到关于 getter 的错误 - 与nameof(IMediaPanel.IsNextEntityExists).

无论如何,我找到了答案,这个“getter”错误是 ReSharper 的错误(请参阅我自己的答案)。

0 投票
1 回答
332 浏览

c# - 是否可以在 lambda 表达式中使用 nameof() 获取原始参数名称?

我需要创建一个 CSV 样式的参数字符串,映射到它们的值。例如:

像这样调用:

我想要一个像 string 这样的输出example

我需要为大量具有许多不同签名的方法执行此操作,并且可能不会使用每个方法中的所有参数而没有可辨别的模式 - 所以我尝试创建一种方法来稍微自动化该过程。

我试图使用委托和名称来解决这个问题:

像这样调用:

我发现这会导致使用 lambda 中的变量名称而不是原始参数名称 - 因此每个值都错误地parameter从 lambda 映射到。

我正在尝试做的事情甚至可能实现吗?还是有另一种方法可以解决这个问题?

0 投票
1 回答
179 浏览

c# - 这个 nameof() 真的是递归调用吗?

我现在正在用 C# 制作一个 ConfigurationSection。我决定通过使用 nameof(PropertyName) 而不是硬编码字符串来利用一些 C# 6 功能。

但是,我从 Resharper 那里得到了一个关于递归调用的奇怪结果。

这是一个例子:

递归警告

我可以看到为什么它可能会发出此警告,因为该属性在其内部被引用。但是,我不相信这实际上是递归的。

这个电话有什么我需要担心的吗?

0 投票
2 回答
1239 浏览

c# - 使用 C# 6 nameof 进行隐式和显式类型

C# 6 中最方便的新特性之一是nameof,它允许程序员有效地消除魔术字符串的使用。

根据文档,nameof返回一个字符串:

用于获取变量、类型或成员的简单(非限定)字符串名称。

这适用于以下代码示例中的显式键入:

var但是,当使用带有关键字的隐式类型时:

编译器抛出错误:

在声明之前不能使用局部变量“magicString”

然后,我对 Visual Studio 中可用的 C# Interactive 窗口进行了更多试验。同样,第一个示例运行良好,但第二个示例这次抛出了不同的错误:

错误 CS7019:无法推断“magicString”的类型,因为它的初始化程序直接或间接引用了定义。

表达式明明返回的nameof是一个字符串,那么为什么编译器在与初始化变量一起使用时不能隐式输入呢?