#android #kotlin
#Android #kotlin
Вопрос:
У меня есть куча классов моделей, таких как:
data class UserModel(
val id: String,
var label: String,
val color: String
)
и я хочу написать функцию, которая позволяет мне указывать переменную для замены и значение для ее замены.
Что-то вроде:
fun updateSomeValue (key: String, value: String) {
user.key = value /// i.e. if key == "label" then this will be read as user.label = value
}
Возможно ли такое вообще? Это для диалогового окна, поэтому мне не нужно писать 20 обратных вызовов диалогового окна для работы с каждым типом var, который может быть обновлен, я хочу просто указать var и значение в одной функции.
Комментарии:
1. «Возможно ли такое вообще?» — не совсем. У вас может быть a
when
, который проверяет каждое возможноеkey
значение и использует его для обновления связанного свойства. Я подозреваю, что это вас не сильно спасет.2. Это можно сделать с помощью отражения. Это распространено в слабо типизированных языках, таких как JavaScript, но в строго типизированных языках это крайне не рекомендуется. Это инверсия методов объектно-ориентированного проектирования, которая в большинстве случаев усложняет поддержку кода.
Ответ №1:
Вы можете использовать отражение Kotlin
fun updateSomeValue (key: String, value: String) {
val f = UserModel::class.java.getDeclaredField(key)
f.set(instanceOfYourUserModel, value)
}
Комментарии:
1. Спасибо за ответ. К сожалению, он выдает ошибку в f.set: Class … не удается получить доступ к закрытому полю java.lang. Строка com …. ////, нашел ответ, мне пришлось включить f.isAccessible = true перед f.set