这是我的问题。
假设我们有一个data class
User
data class User(var name: String? = null, var age: Int? = null)
我们有 4 个用户对象
val oldUser = User("user1", 10)
val newUser1 = User("user2", null)
val newUser2 = User(null, 60)
val newUser3 = User(null, null)
我想编写一个扩展函数patch
,它接受 2 个User
对象(或任何其他数据类)并返回另一个 User,它是通过User
首先应用 second 的非 null 字段的补丁创建的。
所以对于上述对象,补丁函数的行为应该如下 -
oldUser.patch(newUser1) //returns User("user2", 10) (name is changed)
oldUser.patch(newUser2) //returns User("user1", 60) (age is changed)
oldUser.patch(newUser3) //returns User("user1", 10) (no change)
到目前为止,我能想到的解决方案涉及反射和修改接收器User
。这是代码。
inline fun <reified T : Any> T.patch(new: T): T {
T::class.memberProperties
.filterIsInstance<KMutableProperty<*>>().forEach { field ->
field.getter.call(new)?.let { field.setter.call(this, it) }
}
return this
}
我怎样才能编写一个通用的扩展函数,它可以实现上述行为并且不修改原始对象?