Mam taką klasę danych 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 
)

Potem tworzę to instancję

var user = User(1)

Potem próbuję tego:

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

I działa, ale jeśli spróbuję ustawić wartość taką:

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

Pojawia się błąd:

Nierozwiązane odniesienie: Setter

Nie działa tak:

prop.set(user, "Alex")

(To było oparte na rozwiązaniu dostarczonym tutaj, ale nie działa dla mnie: Rozwiązanie)

4
Vind Iskald 20 luty 2019, 12:07

2 odpowiedzi

Najlepsza odpowiedź

memberProperties Zwraca Collection<KProperty1<T, *>>, ale potrzebujesz KMutableProperty1. Więc

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

Odlewa jest potrzebna, ponieważ inteligentna obsada dałaby tylko KMutableProperty1<T, *> i w każdym razie nie można nazwać set, ponieważ kompilator nie wie, jakiego typu akceptujesz jako drugi parametr.

0
Alexey Romanov 20 luty 2019, 09:19

Kiedy dostałeś instancję swojego obiektu, po prostu to zrobić -> user.name = "toto"

0
Mathieu Heuzey 20 luty 2019, 09:24