我有一个

class Foo {
    lateinit var property1: String
    lateinit var property2: Int
    lateinit var property3: Long
}
那么有可能在这样的函数中传递类的属性吗?
fun bar(fooProperty: FooProperty) {
    println(
        when(fooProperty) {
            Foo.property1 -> "Property1"
            Foo.property2 -> "Property2"
            Foo.property3 -> "Property3"
        }
    )
}
但是,这是无效的代码。我只是想知道这是否可以实现。

最佳答案

是的,这是可能的,只需使用ClassName::propertyName获取对该属性的引用,并使用KProperty1<ClassName, *>作为参数类型。
因此,带有示例类的full working example(进行了一些更改以使该类可以编译)看起来像:

import kotlin.reflect.KProperty1

class Foo {
    lateinit var property1: String
    var property2: Int = 0
    var property3: Long = 0
}

fun bar(fooProperty: KProperty1<Foo, *>) {
    println(
        when(fooProperty) {
            Foo::property1 -> "Property1"
            Foo::property2 -> "Property2"
            Foo::property3 -> "Property3"
            else -> throw IllegalArgumentException("Not a known property")
        }
    )
}

fun main() {
    bar(Foo::property2)
}
此打印
Property2

10-05 23:59