gpt4 book ai didi

kotlin - Kotlin数据类:如果在编译时不知道属性名称,该如何设置属性?

转载 作者:行者123 更新时间:2023-12-02 13:34:43 24 4
gpt4 key购买 nike

因此,我试图在编译后设置数据类的属性。我正在尝试使用方括号表示法,但是IDE却在用以下命令 mock 我:No set method providing array access

我做了一些研究,看来我需要使用Reflection api。使用memberProperties尝试过,但是在识别出该属性之后,就没有setter方法了。所以,我在这里希望找到一些指导。

这是我想要做的一个人为的示例:

data class EmailMessageStats(
var bounce: Int = 0,
var click: Int = 0,
var deferred: Int = 0,
var delivered: Int = 0,
var dropped: Int = 0,
var open: Int = 0,
var processed: Int = 0,
var spamreport: Int = 0
)

val sampleResponseFromDatabase = listOf(
mapOf("type" to "bounce", "value" to 148),
mapOf("type" to "click", "value" to 142),
mapOf("type" to "deferred", "value" to 286),
mapOf("type" to "delivered", "value" to 700),
mapOf("type" to "dropped", "value" to 152),
mapOf("type" to "open", "value" to 550),
mapOf("type" to "processed", "value" to 1000),
mapOf("type" to "spamreport", "value" to 140)
)

var summary = EmailMessageStats()
for (row in sampleResponseFromDatabase) {
val type = row["type"] // e.g. bounce
val value = row["value"] //e.g. 148
summary[type] = value
}

println(summary)

最佳答案

我为此功能做了一个Kotlin扩展功能:

fun Any.setPropertyValue(propName: String, value: Any) {
for (prop in this::class.declaredMemberProperties) {
if (prop.name == propName) {
(prop as? KMutableProperty<*>)?.setter?.call(this, value)
}
}
}

同样,获取属性值:
fun Any.getPropertyValue(propName: String): Any? {
for (prop in this::class.declaredMemberProperties) {
if (prop.name == propName) return prop.getter.call(this)
}
return null
}

在这里,您可以按如下所示设置属性:
var summary = EmailMessageStats()
for (row in sampleResponseFromDatabase) {
val type = row["type"] // e.g. bounce
val value = row["value"] //e.g. 148
summary.setPropertyValue(type, value)
}

如果只需要与 declaredMemberProperties相关的字段,请记住使用 EmailMessageStats。否则,如果 EmailMessageStats是从另一个对象扩展的,它也将迭代该对象的字段。

关于kotlin - Kotlin数据类:如果在编译时不知道属性名称,该如何设置属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59415554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com