Можете ли вы передать имя переменной функции для ее редактирования?

#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