Kotlin - получить все свойства от основного конструктора - PullRequest
0 голосов
/ 16 февраля 2019

Я создал этот метод расширения, который получает все свойства из KClass<T>

Метод расширения

@Suppress("UNCHECKED_CAST")
inline fun <reified T : Any> KClass<T>.getProperties(): Iterable<KProperty1<T, *>> {
    return members.filter { it is KProperty1<*, *> }.map { it as KProperty1<T, *> }
}

Пример использования

data class Foo(val bar: Int) {
    val baz: String = String.EMPTY
    var boo: String? = null
}

val properties = Foo::class.getProperties()

Результат

val com.demo.Foo.bar: kotlin.Int

val com.demo.Foo.baz: kotlin.String

var com.demo.Foo.boo: kotlin.String?

Как изменить этот метод расширения, чтобы он возвращал только свойства, объявленные в первичном конструкторе?

Ожидаемый результат

val com.demo.Foo.bar: kotlin.Int

1 Ответ

0 голосов
/ 17 февраля 2019

Вы можете получить параметры конструктора, получив primaryConstructor и затем valueParameters, и поскольку первичный конструктор не требуется для класса kotlin, мы можем сделать что-то вроде этого

inline fun <reified T : Any> KClass<T>.getProperties(): Iterable<KParameter> {
   return primaryConstructor?.valueParameters ?: emptyList()
}

, поэтому, если мы будем запрашивать свойства класса Foo

val properties = Foo::class.getProperties()
properties.forEach { println(it.toString()) }

мы получим

parameter #0 bar of fun <init>(kotlin.Int): your.package.Foo

, и результатом будет не KProperty, а KParameter, который может быть более согласован с вашим вариантом использования

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...