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

  • El depurador Android Studio no funciona cuando se usa la compatibilidad con C ++
  • RecyclerView - NullPointerException en .findViewById
  • Combina Java con Kotlin en Android
  • Importación de objects nesteds / funciones de objects en Kotlin
  • Algunos errores ocurrieron al procesar las annotations
  • Delegación de Android Kotlin Mvp Class
  • Clase de datos Igualdad en Kotlin
  • Delegado observable circunloquio
  • Cómo hacer un event handling errores en rxjava2 en android
  • Operator == no se puede aplicar a 'Long' e 'Int' en Kotlin
  • Cómo usar generics en un object complementario