1

这是我的问题。

假设我们有一个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
}

我怎样才能编写一个通用的扩展函数,它可以实现上述行为并且不修改原始对象?

4

0 回答 0