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

我试图减少重复的代码在我的自定义属性获取/设置器只代理不同的层中相同的属性。 代码解释得更好:

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