Класс данных Kotlin - доступ к свойству по переменной, чтобы установить его значение - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть класс данных 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")

Я получаю ошибку:

Неразрешенная ссылка: setter

Ни то, ни другоеэто работает так:

prop.set(user, "Alex")

(Это было основано на решении, представленном здесь, но это не работает для меня: решение )

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

когда вы получили экземпляр нужного вам объекта, вы просто делаете -> user.name = "toto"

0 голосов
/ 20 февраля 2019

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, потому что компилятор не знает, какой тип принять в качестве второгопараметр.

...