我怎样才能给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
的以下子类型表示: KMutableProperty0
, KMutableProperty1
, KMutableProperty2
– 数字表示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) }
我感谢亚历山大。 他的回答给了我以前的想法。