是否可以在 Kotlin 中将类属性作为函数参数传递?

Dj *_*shi 2 generics arguments properties kotlin

我有一个

class Foo {
    lateinit var property1: String
    lateinit var property2: Int
    lateinit var property3: Long
}
Run Code Online (Sandbox Code Playgroud)

那么是否可以在这样的函数中传递类的属性?

fun bar(fooProperty: FooProperty) {
    println(
        when(fooProperty) {
            Foo.property1 -> "Property1"
            Foo.property2 -> "Property2"
            Foo.property3 -> "Property3"
        }
    )
}
Run Code Online (Sandbox Code Playgroud)

然而,这是无效的代码。我只是想知道这是否可以实现。

Rya*_*ley 5

是的,这是可能的,只是ClassName::propertyName用来获取对属性的引用并KProperty1<ClassName, *>作为参数类型。

因此,您的示例类的完整工作示例(稍作更改以使类编译)将如下所示:

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)
}
Run Code Online (Sandbox Code Playgroud)

这打印

Property2
Run Code Online (Sandbox Code Playgroud)