您收到的错误是:
错误:(y,x)Kotlin:“extProp”同时是成员和扩展。不允许引用此类元素
有没有语法生成对扩展方法的引用的机制,该扩展方法也需要包含类。例如,您的扩展可能会使用类的成员,这需要类似“绑定参考文献 https://github.com/Kotlin/KEEP/issues/5“ Kotlin 1.1 中出现(我也不确定是否会涵盖这种情况,它目前是一个开放式问题 https://github.com/Kotlin/KEEP/blob/master/proposals/bound-callable-references.md#open-questions)。所以目前来说,有no ::
syntax可用的。像Example::String::extProp
are not可用,也不是常用的尝试Example::String.extProp
句法。但你可以通过反思找到它。
首先您需要知道您将收到的类型是:
KProperty2<INSTANCE, EXTENDING, PROPTYPE>
而类的正常属性是:
KProperty1<INSTANCE, PROPTYPE>
您需要知道这一点,因为任何对getter
将需要类实例和属性正在扩展的类的实例。因此,您不能像调用类的属性引用那样调用它。
您可以使用此函数查找类中声明的扩展属性:
@Suppress("UNCHECKED_CAST")
fun <T: Any, EXTENDING: Any, R: Any> KClass<T>.extProp(extends: KClass<EXTENDING>, name: String, returning: KClass<R>): KProperty2<T, EXTENDING, R> {
return this.declaredMemberExtensionProperties.first {
it.name == name &&
it.parameters.size == 2 &&
it.parameters[0].kind == KParameter.Kind.INSTANCE && it.parameters[0].type == this.defaultType &&
it.parameters[1].kind == KParameter.Kind.EXTENSION_RECEIVER && it.parameters[1].type == extends.defaultType &&
it.returnType == returning.defaultType
} as KProperty2<T, EXTENDING, R>
}
这对于检查来说有点矫枉过正,但可以确保它是面向未来的,以防以后添加任何其他类型的扩展。以下是更新后使用它的代码:
class Example() {
val String.extProp: String
get() = "howdy $this"
fun foo() {
val prop = Example::class.extProp(String::class, "extProp", String::class)
println(prop.get(this, "stringy")) // "howdy stringy"
}
}