我正在尝试减少我的自定义属性getter / setter中的重复代码,这些代码只能代理不同层中的相同属性。该代码更好地解释了它:
var emailText
get() = presenter.emailText
set(value) {
presenter.emailText = value
}
我的目标是:
var emailText by PropertyDelegate(presenter.emailText)
问题是我找不到正确的语法来引用实际属性而不是它的值。有一种简单的方法可以做到这一点吗?
答案 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