我有一个像这样的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")
(这是基于此处提供的解决方案,但不适用于我:solution)
答案 0 :(得分:0)
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
,因为编译器不知道哪种类型可以作为其第二个参数。 / p>
答案 1 :(得分:0)
当获得所需对象的实例时,只需执行-> user.name =“ toto”
答案 2 :(得分:0)
如果您以JVM平台为目标,则可以使用Java风格的反射。 要将用户类的用户实例的“名称”属性设置为“亚历克斯”,
val field = "name"
user.javaClass
.getMethod("set${field.capitalize()}", String::class.java)
.invoke(user, "Alex")
并获取“名称”属性,
val userName = user.javaClass
.getMethod("get${field.capitalize()}")
.invoke(user) as String