¿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.

  • ControlsFX SpreadsheetView rowspan IndexOutOfBoundsException
  • Joda DateTime Timezone no aparece correctamente
  • Kotlin start Application crash
  • Android: no se puede actualizar Listview usando CustomAdapter
  • comportamiento inesperado de anulación con la delegación de la class Kotlin
  • Cómo inicializar una variable de reference en Kotlin
  • ¿Cómo get todas las subclasss de una class sellada dada?
  • Cómo realizar la initialization en varios pasos de val
  • Aplicación; había usado un AppComponent diferente; durante la verificación previa
  • Los files de Kotlin + Dagger 2: Dagger * no generarán
  • No puedo contactar a ningún miembro de la class de una class anidada en Kotlin