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

时间:2019-02-20 09:07:15

标签: reflection kotlin data-class

我有一个像这样的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

3 个答案:

答案 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