Kotlin 我是否可以通过编程方式设置任何类型的属性?

Kotlin 我是否可以通过编程方式设置任何类型的属性?,kotlin,reflection,properties,Kotlin,Reflection,Properties,我试图编写一个函数,在给定属性类型和值的数据类中设置属性。该数据类具有多种类型的属性,如String、View和Int,有些属性可以为null。如果我将功能限制为一种类型,我可以做到这一点,如下所示: fun setDataValue(index: TableIndex, key: KMutableProperty1<CellData, String>, value: String) { val cellData = this.tableData[index] key

我试图编写一个函数,在给定属性类型和值的数据类中设置属性。该数据类具有多种类型的属性,如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)
在这种情况下,函数调用上的错误消失,但
键上出现错误。set
行:
类型不匹配。必需:无,找到:有?

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


有办法做到这一点吗?我已经看过好几次了,另外(出于某种原因,我只在“从Python迁移”一节中找到了),还有许多StackOverflow的答案,但我没有找到任何将所有必要的部分联系在一起的方法。

您可以使用泛型来实现这一点

fun <T> setDataValue(index: TableIndex, key: KMutableProperty1<CellData, T>, value: T) {
    val cellData = this.tableData[index]
    key.set(cellData, value)
}
fun setDataValue(索引:TableIndex,键:KMutableProperty1,值:T){
val cellData=this.tableData[index]
key.set(单元格数据、值)
}
它可以工作!这里有更多信息:。如果我理解正确,这个函数签名将允许我在需要时调用它时指定一个类型,比如
setDataValue(0,CellData::name,“arlomedia”)
。但是在我的例子中,不需要
,因为这从
CellData::name
属性可以明显看出。
fun <T> setDataValue(index: TableIndex, key: KMutableProperty1<CellData, T>, value: T) {
    val cellData = this.tableData[index]
    key.set(cellData, value)
}