Как получить имя переменной в Kotlin?

У меня в приложении есть класс Kotlin с большим количеством атрибутов, и я хочу построить метод, который сохраняет имя переменной в словаре. Словарь выглядит так:

HashMap<String, Pair<Any, Any>>()

Целью этого является сохранение изменений, внесенных в определенный атрибут, я сохраняю имя переменной в качестве ключа, а в паре я сохраняю старое значение и новое значение. Для уведомления об изменениях я использую шаблон Observer. Таким образом, всякий раз, когда сеттер вызывается из атрибута, об изменении будет сообщено и сохранено в словаре.

Код ниже приводит к следующему:

var person = Person("Harry", 44)
person.age = 45

HashMap("age", (44, 45))

Сейчас я просто жестко прописываю имя переменной в виде строки, поэтому мой вопрос:

Как динамически получить имя переменной в Kotlin?

Я видел тот же вопрос в Java: Отражение Java: Как получить имя переменной?

Также некоторые другие вопросы по той же теме, утверждающие, что это невозможно: Получить свойство name переменной

Я могу понять, что невозможно получить имя переменной, потому что у простого компилятора такой информации нет, но я все еще стараюсь понять, есть ли у других решение этой проблемы.

2 ответа

Решение

Я думаю, что свойства делегатов являются решением моей проблемы:

class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
    return "$thisRef, thank you for delegating '${property.name}' to me!"
}

operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
    println("$value has been assigned to '${property.name}' in $thisRef.")
  }
}

Кредиты поступают по адресу: Roland Источник: https://kotlinlang.org/docs/reference/delegated-properties.html

Как указано в документации Kotlin о Reflection:

val x = 1

fun main() {
    println(::x.get())
    println(::x.name) 
}

Выражение ::x оценивает свойство объекта типа KProperty<Int>, что позволяет нам читать его значение с помощью get() или получить имя свойства, используя name имущество.

Использовать memberPropertiesчтобы получить имена атрибутов класса и других свойств. Например:

YourClass::class.memberProperties.map {
 println(it.name)
 println(it.returnType)
}
Другие вопросы по тегам