Я переработал предыдущий ответ Андрея Вдовиченко следующим образом:
data class Key(val id: Int, val secret: String, val description: String?){
override fun toString() = kotlinToString(target = this, properties = arrayOf(prop(Key::id), prop(Key::description), prop(Key::secret)))
}
fun <T>prop(kp : KProperty1<T, Any?>) : KProperty1<Any, Any?> {
return kp as KProperty1<Any, Any?>
}
fun kotlinToString(target: Any, properties : Array<KProperty1<Any, Any?>>) : String {
return properties
.map { kp -> Pair(kp.name, kp.get(target)) }
.filter { p -> p.second != null }
.map { p -> "${p.first}: ${p.second}" }
.joinToString(", ")
}
Вы можете протестировать реализацию mi, используя следующую функцию main
:
fun main(args : Array<String>) {
println(Key(1, "aa", "bbb").toString())
println(Key(1, "aa", null).toString())
}
, выход которой равен
id: 1, description: bbb, secret: aa
id: 1, secret: aa
Может быть, вы можете изменить реализацию kotlinToString
, чтобы включить в выходную строку префикс для класса , возможно, передав его в качестве параметра kotlinToString
, но я надеюсь, что это можетпривет тебе!