【发布时间】:2020-10-24 20:40:26
【问题描述】:
我正在尝试用 niceAssign() 替换 assign() 方法:
class Builder<T : Any>(val kClass: KClass<T>) {
fun <K> assign(prop: KProperty1<T, K>, value: K): Builder<T> = TODO("doing other stuff here")
fun <K> niceAssign(call: KClass<T>.() -> Pair<KProperty1<T, K>, K>) : Builder<T> {
val (prop, value) = call(kClass)
return assign(prop, value)
}
}
val builder = Builder(Data::class)
builder.assign(Data::someProperty, "some value") // (1)
builder.niceAssign { ::someProperty to "some value" } // (2)
由于 builder 对象是使用 Data 类生成的,因此我不需要在传递属性引用时明确指出 Data 类。分配方法已经知道该属性属于哪个类。所以我不想每次在assign方法中都写“Data::”(就像在代码(1)中一样),但我想将“Data::”作为niceAssign参数的接收器属性传递,所以我可以参考::来自“this”对象的一些属性。
这段代码 sn-p 不起作用,因为我将 KClass 作为接收者传递,而 KClass 没有 T 的属性引用。 那么,有什么方法可以让它发挥作用吗?
【问题讨论】:
标签: kotlin generics reflection