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

时间:2019-02-16 19:47:14

标签: kotlin

我创建了这个扩展方法,该方法从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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

inline fun <reified T : Any> KClass<T>.getProperties(): List<KProperty<*>> {
    val primaryConstructor = primaryConstructor ?: return emptyList()
    // Get the primary constructor of the class ^

    return declaredMemberProperties.filter {
    // Get the declared properties of the class; i.e. bar, baz, boo
        primaryConstructor.parameters.any { p -> it.name == p.name } 
        // Filter it so there are only class-properties whch are also found in the primary constructor.
    }
}

总而言之,此函数基本上采用在类中找到的所有属性并对它们进行过滤,以便仅在主要构造函数中找到的 仍然保留。