¿Cómo puedo asignar un valor al parámetro KMutableProperty?

En un método, me gustaría recibir KMutableProperty como parámetro y asignarle un valor.

Otra pregunta es cuál es la forma correcta de pasar un parámetro a dicho método.

Básicamente me gustaría tener algo así:

class MyBinder { ... fun bind(property: KMutableProperty<Int>): Unit { property.set(internalIntValue) } } 

Y luego llámalo en otra class

  myBinder.bind(this::intProperty) 

Kotlin 1.0 no permite la syntax this::intProperty , pero esto se está trabajando actualmente y pronto estará disponible como parte de la vista previa de acceso anticipado de 1.1 ( problema , propuesta KEEP ).

Con esto en mente, consideraría hacer lo que está describiendo de otra manera, por ejemplo, haciendo que bind acepte una lambda que establezca la propiedad:

 class MyBinder { fun bind(setProperty: (Int) -> Unit) { setProperty(internalIntValue) } } ... myBinder.bind { intProperty = it } 

De todos modos, para responder a su pregunta sobre cómo establecer el valor de KMutableProperty : para establecer el valor de alguna propiedad o, técnicamente hablando, para invocar el establecedor de propiedad, debe conocer su arity, o el número de parameters de esa propiedad (y su getter / setter ) acepta. Las properties declaradas en un file no aceptan ningún parámetro, las properties de miembro y las properties de extensión requieren un parámetro (la instancia de receptor), mientras que las properties de miembro que también son extensiones toman dos parameters. Este tipo de properties están representadas por los siguientes subtypes de KMutableProperty respectivamente: KMutableProperty0 , KMutableProperty1 , KMutableProperty2 – el número significa arity y sus parameters generics de tipo significan los types de receptores. Cada uno de estos types de properties tiene un método set con los parameters correspondientes. Algunos ejemplos:

 fun setValue(property: KMutableProperty0<Int>, value: Int) { property.set(value) } fun setValue(property: KMutableProperty1<SomeType, Int>, instance: SomeType, value: Int) { property.set(instance, value) } 

Tenga en count que no hay set método set (o get ) en la interfaz abstracta de KMutableProperty precisamente porque es imposible declararlo, sin saber la cantidad de parameters requeridos del receptor.

Además de la respuesta de Alexander, puedes intentar algo como esto:

 import kotlin.reflect.KMutableProperty class Binder { val internalIntValue = 10 fun bind(self: Any, aProperty: KMutableProperty<Int>) { aProperty.setter.call(self, internalIntValue) } } class Foo { var bar = 1 fun changeBar() { Binder().bind(this, Foo::bar) } } fun main(args: Array<String>) { val foo = Foo() assert(1 == foo.bar) foo.changeBar() assert(10 == foo.bar) } 

Una forma más robusta / segura de hacer lo mismo:

 fun <T> bind(self: T, aProperty: KMutableProperty1<T, Int>) { aProperty.set(self, internalIntValue) } 

Mi agradecimiento a Alexander. Su respuesta me dio la idea previa.

  • kotlin coroutine y la relación entre el manejador principal
  • Escribir Daos del reino con transactions cerradas
  • Filtro para tipo genérico sin reflexión o casting
  • reference no resuelta: callback
  • ¿Cómo crear una instancia de una class abstracta en Kotlin?
  • Cómo crear el controller de respuesta genérica para el error y validar la respuesta utilizando retrofit, rxjava y dagger
  • Herencias internas Herencia en Kotlin
  • Convierta un file groovy build.gradle existente en un build basado en kotlin build.gradle.kts
  • Excepción al usar spring-data-mongodb con Kotlin
  • ¿Falta la sala de cheques SQL en time de compilation?
  • La debugging de Android Kotlin Task no se encuentra en el proyecto raíz