我怎样才能给KMutableProperty参数赋值?

在一个方法中,我想接收KMutableProperty作为参数,并为其分配一个值。

另一个问题是将参数传递给这种方法的正确方法是什么。

基本上我想有这样的事情:

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

然后在另一个班上打电话

  myBinder.bind(this::intProperty) 

Kotlin 1.0不允许使用this::intProperty语法,但是这个工作目前正在进行,并且很快将会作为1.1的早期访问预览( issue , KEEP提案 )的一部分提供。

考虑到这一点,我会考虑以另一种方式来描述你正在描述的内容,比如让bind接受一个设置属性的lambda:

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

无论如何,要回答你关于设置KMutableProperty的值的KMutableProperty :设置一些属性的值,或者从技术上来说,要调用属性设置器,你应该知道它的参数,或者参数的数量(和它的getter / setter )接受。 在文件中声明的属性不接受任何参数,成员属性和扩展属性需要一个参数(接收者实例),而也是扩展名的成员属性需要两个参数。 这些类型的属性分别由KMutableProperty的以下子类型表示: KMutableProperty0KMutableProperty1KMutableProperty2 – 数字表示arity及其泛型类型参数表示接收者的类型。 每个属性类型都有一个带有相应参数的set方法。 一些例子:

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

请注意,抽象KMutableProperty接口中没有set (或get )方法,因为不可能声明它,不知道所需接收器参数的数量。

除了亚历山大的答案,你可以尝试这样的事情:

 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) } 

一个更强大/安全的方式来做同样的事情:

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

我感谢亚历山大。 他的回答给了我以前的想法。