如何编写委托给另一个属性的委托?

时间:2018-01-31 21:54:02

标签: kotlin

我正在尝试减少我的自定义属性getter / setter中的重复代码,这些代码只能代理不同层中的相同属性。该代码更好地解释了它:

var emailText
    get() = presenter.emailText
    set(value) {
        presenter.emailText = value
    }

我的目标是:

var emailText by PropertyDelegate(presenter.emailText)

问题是我找不到正确的语法来引用实际属性而不是它的值。有一种简单的方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:2)

您可以根据documentation

中的说明实现委托
class PropertyDelegate<R>(private val prop: KProperty<R>) {
    private fun ensureDifference(prop1: KProperty<*>, prop2: KProperty<*>) {
        if (prop1.javaField == prop2.javaField) throw IllegalArgumentException("Can't delegate to same property.")
    }

    operator fun getValue(thisRef: Any?, property: KProperty<*>): R {
        ensureDifference(prop, property)
        return prop.getter.call()
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: R) {
        ensureDifference(prop, property)
        return (prop as? KMutableProperty<R>)?.setter?.call(value)
                ?: throw IllegalArgumentException("Cannot set val property")
    }
}

像这样使用:

class X(var xProp: String)

class Y(var x: X) {
    var y: String by PropertyDelegate(x::xProp)
}

请注意,此项仅应与可变var属性一起使用。

答案 1 :(得分:1)

要获得该属性,您可以presenter::emailText。它返回KProperty