Создание функции Kotlin для принятия строки в качестве ссылки на объект - PullRequest
0 голосов
/ 25 марта 2020

У меня есть ситуация, когда в Kotlin я хочу взять имя ссылки, изменить ее, а затем вызвать функцию с объектом, который соответствует измененному имени. Например:

val a = "Foo"
val aAlt = "Bar"

fun doSomething(s: String){ 
   println(s.*addAltToStringName()* ) 
}

Чтобы при вызове

doSomething(a)

получился результат

Bar

Я знаю, что происходит что-то вроде «нетипизированного скрипта», подобного этому в объектно-ориентированном языке это опасно, но у меня есть другие проверки, чтобы предотвратить Nullpointers et c.

Спасибо!

1 Ответ

0 голосов
/ 25 марта 2020

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

class Test {
    val a = "Foo"
    val aAlt = "Bar"

    fun doSomething(s: KProperty<*>){
        val propertyName = s.name + "Alt"
        val propertyValue = Test::class.memberProperties.find { it.name == propertyName }?.get(this)
        println(propertyValue)
    }
}

fun main() {
    val test = Test()
    test.doSomething(test::a)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...