Могу ли я установить переменную объекта со значением отражения для свойства другого объекта? - PullRequest
0 голосов
/ 24 октября 2019

У меня есть класс, у которого есть свойство, тип которого KMutableVar1. Объекты этого класса имеют переменную, назначенную для отражения свойства другого класса. У меня есть функция, которая должна принимать объект первого класса и использует ее переменную типа KMutableVar1, чтобы определить, какое свойство объекта второго класса редактировать.

Боже, этот абзац ужасен, мне так жаль> <</p>

Я уже пытался присвоить переменную KMutableVar1 объекта другой переменной, а затем пытался связать эту переменную с объектом, используя точечную запись, ноэто имя переменной отсутствует в главном конструкторе класса, и поэтому возникает ошибка.


class Thing(var amount: Int, var id: Int){
     fun editAttributes(object: Thing, editor: RemoteEdit){
          //My initial thought here was to do the following:
          var editing = editor.attributeToEdit
          object.editing = editor.newValue
          //But this raises an error since class 'thing' has no attribute 'editing'
     }
}

var bananas = Thing(amount = 12, id = 21)

class RemoteEdit(var attributeToEdit: KMutableVar1, var newValue: Int)

var remoteEditor = RemoteEdit(attributeToEdit = Thing::amount, newValue = 23)

Мое намерение состоит в том, чтобы функция сменила bananas.amount на 23.

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

У меня такое чувство, что это может быть проблемой XY, потому что в вашем коде происходит так много необычных вещей. Почему реализация изменения значения свойства посредством отражения должна быть в редактируемом классе?

Полагаю, если есть какая-то причина, по которой вам нужно иметь возможность передавать эти параметры для редактирования, вам понадобится класс, но тогда имеет смысл для него реализовать функцию для ее самостоятельного использования:

class RemoteEdit<T, R>(var attributeToEdit: KMutableProperty1<T, R>, var newValue: R) {
    fun execute(item: T) {
        attributeToEdit.set(item, newValue)
    }
}

val bananas = Thing(amount = 12, id = 21)
val edit23 = RemoteEdit(Thing::amount, 23)
edit23.execute(bananas)

Если вам не нужно передавать их, все, что вам нужно, это функция верхнего уровня:

fun <T, R> editProperty(item: T, attributeToEdit: KMutableProperty1<T, R>, newValue: R) =
    attributeToEdit.set(item, newValue)

val bananas = Thing(amount = 12, id = 21)
editProperty(bananas, Thing::amount, 23)
0 голосов
/ 24 октября 2019

Извините, я не совсем понимаю, зачем вам это нужно, но, думаю, это сработает:

import kotlin.reflect.KMutableProperty1

class Thing(var amount: Int, var id: Int) {
    fun editAttributes(editor: RemoteEdit) {
        val editing = editor.attributeToEdit
        editing.set(this, editor.newValue)
    }
}

class RemoteEdit(var attributeToEdit: KMutableProperty1<Thing, Int>, var newValue: Int)

fun main() {
    val bananas = Thing(amount = 12, id = 21)
    val remoteEditor = RemoteEdit(attributeToEdit = Thing::amount, newValue = 23)
    bananas.editAttributes(remoteEditor)
    println(bananas.amount) // prints 23
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...