在一个方法中,我希望接收KMutableProperty作为参数,并给它赋值。
另一个问题是,将参数传递给这种方法的正确方法是什么。
基本上,我想要这样的东西:
class MyBinder {
...
fun bind(property: KMutableProperty<Int>): Unit {
property.set(internalIntValue)
}
}然后在另一个类中调用它
myBinder.bind(this::intProperty)发布于 2016-06-10 16:01:41
Kotlin1.0不允许this::intProperty语法,但目前正在使用,并且将作为早期访问预览1.1 (问题,保留建议)的一部分提供。
考虑到这一点,我会考虑以另一种方式执行您所描述的操作,例如,让bind接受设置属性的lambda:
class MyBinder {
fun bind(setProperty: (Int) -> Unit) {
setProperty(internalIntValue)
}
}
...
myBinder.bind { intProperty = it }无论如何,要回答有关设置KMutableProperty值的问题:要设置某些属性的值,或者从技术上讲,要调用属性设置器,您应该知道它的重要性,或者属性(及其getter/ setter )接受的参数数。文件中声明的属性不接受任何参数,成员属性和扩展名属性需要一个参数(接收方实例),而同时也是扩展的成员属性需要两个参数。这类属性分别由KMutableProperty的以下几个子类型表示:KMutableProperty0、KMutableProperty1、KMutableProperty2 --数字表示的是对称性,它们的泛型参数表示接收机的类型。这些属性类型中的每一种都有一个具有相应参数的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)
}请注意,抽象的set (或get)接口中没有任何方法,这正是因为不可能声明它,不知道所需的接收方参数的数量。
发布于 2016-06-10 16:32:06
除了Alexander的回答之外,您还可以尝试这样的方法:
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)
}感谢亚历山大。他的回答给了我以前的想法。
https://stackoverflow.com/questions/37751966
复制相似问题