首页 > 解决方案 > 我可以以编程方式设置任何类型的属性吗?

问题描述

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

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?的具体类型比.StringStringAny?

我也试过:

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 文档,加上这个文档(出于某种原因,我只在“从 Python 迁移”部分找到了该文档)和许多 StackOverflow 答案,但我没有找到任何与所有相关的东西必要的部分在一起。

标签: kotlinreflectionproperties

解决方案


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

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

推荐阅读