我希望使用Kotlin成员引用创建从根元素A到其声明的成员属性的路径的字符串表示形式,直到到达特定的叶元素.为澄清起见,假设我有一个如下所示的类 struct :
data class A (val propB: B)
data class B (val propC: C)
data class C (val propD: D, val propE: E)
最后,我想创建一个包含例如:propB.propC.propD
或propB.propC.propE
的字符串.它基本上与JSONPath的概念相同.
此关系的上下文在编译时是已知的,因此可以直接硬编码,但如果其中一个属性在重构期间被重命名,这将失败,因此我希望使用带有直接引用的编程方法.
我可以通过使用A::propB.name
来访问此层次 struct 的第一个"级别",它将简单地打印propB
.然而,我找不到一个好的方法来链接这些调用,因为A::propB::propC.name
等是无效的代码.
我试图编写一个Builder类来帮助我将这些引用链接在一起,但它不起作用:
class RefBuilder<R : Any>(val path: String = "", val next: KClass<R>) {
companion object {
inline fun <T, reified R : Any> from(start: KProperty1<T, R>): RefBuilder<R> {
return RefBuilder(start.name, R::class)
}
}
inline fun <reified N : Any> add(nextRef: (KClass<R>) -> KProperty1<R,N>): RefBuilder<N> {
return RefBuilder("$path.${nextRef.invoke(this.next).name}", N::class)
}
override fun toString() = path
}
fun main() {
val builder = RefBuilder.from(A::propB)
builder.add { it::propC } // this doesn't work
println(builder) // should print: "propB.propC"
}
如有任何帮助,我将不胜感激.也许还有一种更简单的解决方案,但我错过了.