我可以以编程方式设置任何类型的 属性 吗?

Can I set a programmatically set a property of any type?

我正在尝试编写一个函数,在给定 属性 类型和值的情况下,在数据 class 中设置 属性。数据 class 具有多种类型的属性,例如 String、View 和 Int,并且某些属性可以为 null。如果我将功能限制为一种类型,我就可以完成这项工作,如下所示:

fun setDataValue(index: TableIndex, key: KMutableProperty1<CellData, String>, value: String) {
    val cellData = this.tableData[index]
    key.set(cellData, value)
}

setDataValue(0, CellData::name, "arlomedia")

但我找不到允许多种类型的方法,例如:

fun setDataValue(index: TableIndex, key: KMutableProperty1<CellData, Any?>, value: Any?) {
    val cellData = this.tableData[index]
    key.set(cellData, value)
}

setDataValue(0, CellData::name, "arlomedia")
setDataValue(0, CellData::status, null)
setDataValue(0, CellData::active, true)

在这种情况下,第一个函数调用会显示错误 Type mismatch. Required: KMutableProperty1<CellData, Any?>, Found: KMutableProperty1<CellData, String>。我没想到,因为 Any? 是一个比 String 更不具体的类型,所以我想我可以提供一个 String 当所有需要的是 Any?.

我也试过:

fun setDataValue(index: TableIndex, key: KMutableProperty1<CellData, *>, value: Any?) {
    val cellData = this.tableData[index]
    key.set(cellData, value)
}

setDataValue(0, CellData::name, "arlomedia")

在这种情况下,函数调用的错误消失了,但 key.set 行出现错误:Type mismatch. Required: Nothing, Found: Any?.

我想我可以为每种数据类型创建一个单独的函数并根据需要调用各种函数,但是这个函数的目的是抽象一些更复杂的数据访问,如果我有在多个函数中重复这一点。

有办法吗?我经历了 Kotlin Reflection documentation several times, plus this document(出于某种原因我只在“从 Python 迁移”部分找到了)和许多 Whosebug 答案,但我没有找到任何相关的内容必要的部分拼在一起。

您可以使用泛型来做到这一点

fun <T> setDataValue(index: TableIndex, key: KMutableProperty1<CellData, T>, value: T) {
    val cellData = this.tableData[index]
    key.set(cellData, value)
}