Kotlin - 有没有办法将 属性 值传递给另一个具有同名属性的对象?
Kotlin - Is there a way to pass property values to another object with properties of the same name?
有没有办法将 属性 值传递给具有相同名称属性的另一个对象以避免具有 "repeated" 代码?
例如,避免 CepReceiptsInfo
与 value
不同 class 但它们共享一些属性名称和类型:
val cepReceiptsInfo = CepRecepitsInfo()
cepReceiptsInfo.operationTimestamp = value.operationTimestamp
cepReceiptsInfo.sentDate = value.sentDate
cepReceiptsInfo.sentTime = value.sentTime
cepReceiptsInfo.concept = value.concept
cepReceiptsInfo.referenceNumber = value.referenceNumber
cepReceiptsInfo.amount = value.amount
cepReceiptsInfo.trackingKey = value.trackingKey
cepReceiptsInfo.bankTarget = value.bankTarget
cepReceiptsInfo.bankSource = value.bankSource
cepReceiptsInfo.sourceClienteName = value.sourceClienteName
cepReceiptsInfo.beneficiaryName = value.beneficiaryName
cepReceiptsInfo.accountNumberTarget = value.accountNumberTarget
cepReceiptsInfo.term = value.term
cepReceiptsInfo.authorizationNumber = value.authorizationNumber
cepReceiptsInfo.linkCep = value.linkCep
cepReceiptsInfo.status = value.status
cepReceiptsInfo.bankSourceRefund = value.bankSourceRefund
cepReceiptsInfo.causeRefund = value.causeRefund
cepReceiptsInfo.accountTargetRefund = value.accountTargetRefund
cepReceiptsInfo.currency = value.currency
cepReceiptsInfo.accountNumberSource = value.accountNumberSource
cepReceiptsInfo.accountTypeSource = value.accountTypeSource
cepReceiptsInfo.accountTypeTarget = value.accountTypeTarget
cepReceiptsInfo.indicatorRefund = value.indicatorRefund
cepReceiptsInfo.amountIntRefund = value.amountIntRefund
cepReceiptsInfo.operationRefundTimestamp = value.operationRefundTimestamp
cepReceiptsInfo.dateMovement = value.dateMovement
cepReceiptsInfo.timeMovement = value.timeMovement
cepReceiptsInfo.dateRefund = value.dateRefund
cepReceiptsInfo.timeRefund = value.timeRefund
类似于f.e.:
val cepReceiptsInfo = CepReceintsInfo()
cepReceiptsInfo.assignFrom(value)
两个类都是数据classes。
我不知道没有反射的方法。
fun Any.assignFrom(other: Any) {
val thisProperties = this::class.memberProperties
.filterIsInstance<KMutableProperty<*>>()
.map { it.name to it }
.toMap()
for (property in other::class.memberProperties){
thisProperties[property.name]?.setter?.call(this, property.getter.call(other))
}
}
正如 Tenfour04 所说,该语言没有提供执行此操作的直接方法,因此您只能使用额外的编译时工具或运行时的反射。
由于这是一个相当普遍的问题,因此有一个名为 ModelMapper 的 Java 库可以为您解决这个问题;与几乎所有 Java 库一样,您也可以在 Kotlin 中使用它。
(我偶尔使用过它。它可以避免大量样板代码。虽然我没有发现它像首页声称的那样重构安全......它还“隐藏”了对字段的引用IDE 不会跟踪。因此这不是一个完美的解决方案。)
有没有办法将 属性 值传递给具有相同名称属性的另一个对象以避免具有 "repeated" 代码?
例如,避免 CepReceiptsInfo
与 value
不同 class 但它们共享一些属性名称和类型:
val cepReceiptsInfo = CepRecepitsInfo()
cepReceiptsInfo.operationTimestamp = value.operationTimestamp
cepReceiptsInfo.sentDate = value.sentDate
cepReceiptsInfo.sentTime = value.sentTime
cepReceiptsInfo.concept = value.concept
cepReceiptsInfo.referenceNumber = value.referenceNumber
cepReceiptsInfo.amount = value.amount
cepReceiptsInfo.trackingKey = value.trackingKey
cepReceiptsInfo.bankTarget = value.bankTarget
cepReceiptsInfo.bankSource = value.bankSource
cepReceiptsInfo.sourceClienteName = value.sourceClienteName
cepReceiptsInfo.beneficiaryName = value.beneficiaryName
cepReceiptsInfo.accountNumberTarget = value.accountNumberTarget
cepReceiptsInfo.term = value.term
cepReceiptsInfo.authorizationNumber = value.authorizationNumber
cepReceiptsInfo.linkCep = value.linkCep
cepReceiptsInfo.status = value.status
cepReceiptsInfo.bankSourceRefund = value.bankSourceRefund
cepReceiptsInfo.causeRefund = value.causeRefund
cepReceiptsInfo.accountTargetRefund = value.accountTargetRefund
cepReceiptsInfo.currency = value.currency
cepReceiptsInfo.accountNumberSource = value.accountNumberSource
cepReceiptsInfo.accountTypeSource = value.accountTypeSource
cepReceiptsInfo.accountTypeTarget = value.accountTypeTarget
cepReceiptsInfo.indicatorRefund = value.indicatorRefund
cepReceiptsInfo.amountIntRefund = value.amountIntRefund
cepReceiptsInfo.operationRefundTimestamp = value.operationRefundTimestamp
cepReceiptsInfo.dateMovement = value.dateMovement
cepReceiptsInfo.timeMovement = value.timeMovement
cepReceiptsInfo.dateRefund = value.dateRefund
cepReceiptsInfo.timeRefund = value.timeRefund
类似于f.e.:
val cepReceiptsInfo = CepReceintsInfo()
cepReceiptsInfo.assignFrom(value)
两个类都是数据classes。
我不知道没有反射的方法。
fun Any.assignFrom(other: Any) {
val thisProperties = this::class.memberProperties
.filterIsInstance<KMutableProperty<*>>()
.map { it.name to it }
.toMap()
for (property in other::class.memberProperties){
thisProperties[property.name]?.setter?.call(this, property.getter.call(other))
}
}
正如 Tenfour04 所说,该语言没有提供执行此操作的直接方法,因此您只能使用额外的编译时工具或运行时的反射。
由于这是一个相当普遍的问题,因此有一个名为 ModelMapper 的 Java 库可以为您解决这个问题;与几乎所有 Java 库一样,您也可以在 Kotlin 中使用它。
(我偶尔使用过它。它可以避免大量样板代码。虽然我没有发现它像首页声称的那样重构安全......它还“隐藏”了对字段的引用IDE 不会跟踪。因此这不是一个完美的解决方案。)