代码之家  ›  专栏  ›  技术社区  ›  Matthew Layton

Kotlin-从主构造函数获取所有属性

  •  0
  • Matthew Layton  · 技术社区  · 6 年前

    我已经创建了这个扩展方法,它从 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网站

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

    如何修改此扩展方法以仅返回在主构造函数中声明的属性?

    预期结果

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

    0 回复  |  直到 6 年前
        1
  •  2
  •   szymon_prz    6 年前

    通过获取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,它可能更符合您的用例