Kotlin数据类-通过变量访问属性以设置其值

qnyhuwrf  于 2022-11-16  发布在  Kotlin
关注(0)|答案(3)|浏览(153)

我有一个Kotlin数据类,如下所示:

data class User(
    var id: Int,
    var name: String? = null,
    var email: String? = null,
    var age: Int? = null,
    var latitude: Float? = null,
    var longitude: Float? = null 
)

然后创建它的示例

var user = User(1)

然后我试试这个:

val field = "name"
var prop = User::class.memberProperties.find {it -> it.name == field}!!
prop.get(user)

它是有效的,但是如果我试着这样设置值:

prop.setter.call(user, "Alex")

出现错误:
未解析的引用:装配工
它的工作原理也不是这样的:

prop.set(user, "Alex")

(This基于此处提供的解决方案,但它对我不起作用:(第10页)

lskq00tm

lskq00tm1#

memberProperties返回一个Collection<KProperty1<T, *>>,但是你需要KMutableProperty1

if (prop is KMutableProperty1) {
    (prop as KMutableProperty1<T, Any>).set(user, "Alex")
} else { 
    // what do you want to do if the property is immutable?
}

之所以需要强制转换,是因为智能强制转换只会给予你一个KMutableProperty1<T, *>,而且你无论如何都不能调用set,因为编译器不知道接受什么类型作为它的第二个参数。

wwtsj6pe

wwtsj6pe2#

当您获得所需对象的示例时,只需执行以下操作:user.name =“toto”

yb3bgrhw

yb3bgrhw3#

如果目标是JVM平台,可以使用Java风格的反射。要将类User的用户示例的“name”属性设置为“Alex,”

val field = "name"
user.javaClass
    .getMethod("set${field.capitalize()}", String::class.java)
    .invoke(user, "Alex")

要获取“name”属性,

val userName = user.javaClass
    .getMethod("get${field.capitalize()}")
    .invoke(user) as String

相关问题