将Kotlin数据类打印为可编译代码的最简单方法是什么?

将Kotlin数据类打印为可编译代码的最简单方法是什么?,kotlin,Kotlin,我希望能够将一个相当简单的Kotlin数据类的实例转换为一个字符串,该字符串可以复制并粘贴到Kotlin文件中,然后进行编译 例如,给定这些数据类: data class Parent(val name: String, val age: Int, val children: Set<Child>) data class Child(val name: String, val age: Int) 会回来吗 """Parent("Joe", 34, setOf(Child("Amy"

我希望能够将一个相当简单的Kotlin数据类的实例转换为一个字符串,该字符串可以复制并粘贴到Kotlin文件中,然后进行编译

例如,给定这些数据类:

data class Parent(val name: String, val age: Int, val children: Set<Child>)
data class Child(val name: String, val age: Int)
会回来吗

"""Parent("Joe", 34, setOf(Child("Amy", 4), Child("Bob", 7)))"""

是否存在这样的情况?

我们可以覆盖toString的行为,以所需的格式输出:

fun main() {
    var amy = Child(name="Amy",age=4)
    var bob = Child(name="Bob",age=7)
    var joe = Parent(name="Joe", age=34, children=setOf(amy, bob))

    print(joe) // outputs "Parent("Joe", 34, setOf(Child("Amy", 4), Child("Bob", 7))"
}

data class Parent(val name: String, val age: Int, val children: Set<Child>) {
    override fun toString() = "Parent(\"$name\", $age, setOf(${children.joinToString()})"
}
data class Child(val name: String, val age: Int) {
    override fun toString() = "Child(\"$name\", $age)"
}
fun main(){
var amy=Child(name=“amy”,年龄=4岁)
变量bob=Child(name=“bob”,年龄=7岁)
var joe=父母(name=“joe”,年龄=34岁,子女=setOf(艾米,鲍勃))
print(joe)//输出“Parent(“joe”,34,setOf(Child(“Amy”,4),Child(“Bob”,7))”
}
数据类父级(val名称:String,val年龄:Int,val子级:Set){
重写fun-toString()=“父(\“$name\”,$age,setOf(${children.joinToString()})”
}
数据类子级(val名称:字符串,val年龄:Int){
重写fun-toString()=“Child(\“$name\”,$age)”
}

借助于
joinToString()
,这将以
“Parent(“Joe”,34,setOf(Child(“Amy”,4),Child(“Bob”,7))”的格式输出。
,如果你真的喜欢痛苦,有专门为这类事情制作的反射工具。我制作了一个小函数,可以生成你需要的东西:

fun dataClassToString(instance: Any) {
    val sb = StringBuilder()
    sb.append("data class ${instance::class.qualifiedName} (")
    var prefix = ""
    instance::class.memberProperties.forEach{
        sb.append(prefix)
        prefix = ","
        sb.append("${it.name} = ${it.getter.call(instance)}")
    }
    sb.append(")")
    println(sb.toString())
}
此函数的唯一问题是,对于父类,它会生成以下内容:

data class Parent (age = 34,children = [Child(name=Amy, age=4), Child(name=Bob, age=7)],name = Joe)

内部集合表示为数组,但是如果您确定只有集合或数组,您可以轻松检查它是什么类型,并在创建集合时附加该类型。您还可以检查这是否是数据类,并附加它而不是硬编码字符串。

很好,尽管字符串周围缺少引号。但我很抱歉king支持一些通用的东西,不必覆盖每个数据类上的toString。我当然可以手动滚动一些东西,我希望已经有一个库函数可以为我这样做。
data class Parent (age = 34,children = [Child(name=Amy, age=4), Child(name=Bob, age=7)],name = Joe)