如何编写委托给另一个属性的委托?
我试图减少重复的代码在我的自定义属性获取/设置器只代理不同的层中相同的属性。 代码解释得更好:
var emailText get() = presenter.emailText set(value) { presenter.emailText = value }
我的目标是这样的:
var emailText by PropertyDelegate(presenter.emailText)
问题是,我找不到适当的语法来引用实际的属性,而不是它的值。 有一个简单的方法来做到这一点?
您可以根据文档中的描述来实施委托:
class PropertyDelegate(private val prop: KProperty ) { 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 )?.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
属性。
要获得财产,你可以做presenter::emailText
。 它返回一个KProperty