首页 > 解决方案 > 如何动态遍历kotlin中一个类的所有字段?

问题描述

我想动态遍历 kotlin 中一个类的所有字段。目的是我想通过加入所有字段将类对象转换为 TSV。由于会有很多子类,因此动态地执行此操作会很棒。经过一番调查,我在下面找到了解决方案。它确实有效,但字段的顺序与每个字段的声明顺序不一致。

我认为注释可以工作,但不确定如何。任何的想法?谢谢!

abstract class BaseModel {
    fun toTSV(): String {
        return this::class.memberProperties.map {
            it.getter.call(this).toString()
        }.joinToString("\t")
    }
}
class Model (
    val model_id: String,
    val name: String,
    val version: Int,
    val desc: String
) : BaseModel()


fun main(args : Array<String>) {
    val model = Model(
            model_id = "mid",
            name = "model name",
            version = 1,
            desc = "some desc"
    )
    println(model.toTSV())
}

上面的代码产生:

some_desc   mid model_name  1

但我期待:

mid  model_name  1   some_desc

就像类中字段的顺序一样。

标签: kotlin

解决方案


我建议您在每个模型上覆盖 toString,以获取每个字段中的制表符分隔值:)

class MyModel {
var id: Long = 0L
...
override fun toString(): String {
    val sb = StringBuilder()
    sb.append("class MyModel {\n")
    sb.append("    id: ").append(toIndentedString(id)).append("\n")
    sb.append("\n}")
    return sb.toString()
    }
    
    /**
     * Convert the given object to string with each line indented by 4 spaces
     * (except the first line).
     */
    private fun toIndentedString(o: Any?): String {
        return o?.toString()?.replace("\n", "\n    ") ?: "null"
    }

}

这对我每次都有效。


推荐阅读