Kotlin中的C#nameof(Class)等价物

6
在C#中,我们有nameof()操作符,它会返回类的名称字符串,那么在Kotlin中有什么等价物吗?
我的使用场景可能像这样:
internal val TAG = nameof(MyCustomActivity)

1
internal val TAG = MyCustomActivity::class.simpleName - Tenfour04
2个回答

9

正如所接受的答案中所提到的<class>::class.simpleName属性将提供类似于C# nameof 操作符的结果。但是,与nameof不同,::class.*不能在编译时求值。

这一点很重要,因为在C#中使用nameof操作符的情况下,在::class中无法等效地执行。

例如,AspectJ的@Around注释。

以下代码将失败,因为您不能插入非编译时强制执行表达式

@Around("@annotation(${MyAnnotation::class.simpleName})")

如果 Kotlin 支持像 C# 一样在相同的情境下使用 nameof,那么可以这样做:

(指可以在上下文环境中使用)

@Around("@annotation(${nameof(MyAnnotation)})")

因此,尽管接受的答案提供了一种在Kotlin中解决符号名称的功能类似的方式,但它不能像C#中的nameof那样具有相同的灵活性。


有趣的是,在撰写本答案之前,我没有意识到您可以将常量值(和其他编译时可评估)表达式插入注释参数中;以下编译:

const val FOO = "foo"

@MyAnnotation("${FOO} ${1 + 1}")

7
MyCustomActivity::class.simpleName

会输出 MyCustomActivity
MyCustomActivity::class.qualifiedName

会输出<your_package>.MyCustomActivity


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