Kotlin:我可以得到一个对象内的对象使用变量的值是一个对象的名称?



通常我使用JavaScript,在其中你可以这样写:

var objectVar = "myOtherVariable";
var someObject = {
myVariable: "something",
myOtherVariable: "something else"
}
// writes out 'something else'
console.log(someObject[objectVar])

有可能在kotlin中做这样的事情吗?

例如,如果你有

val myVar = "a"
object someObject{
var a: MutableSet<ImageView> = mutableSetOf()
var b: MutableSet<ImageView> = mutableSetOf()
}

你能通过myVar到达someObject.a吗?

编辑

由于普遍的共识是不应该这样做,即使可能,我设法改变了逻辑,所以我不必使用它。

import kotlin.reflect.full.declaredMembers
inline fun <reified T: Any> getPropertyByName(instance: T, name: String): Any? {
return instance::class.declaredMembers.firstOrNull { it.name == name }?.call(instance)
}
// Test:
object SomeObject {
var a: MutableSet<Int> = mutableSetOf(1, 2, 3)
var b: MutableSet<Int> = mutableSetOf(9, 8, 7)
}
println(getPropertyByName(SomeObject, "a"))   // Output: [1, 2, 3]
println(getPropertyByName(SomeObject, "b"))   // Output: [9, 8, 7]
@Suppress("UNCHECKED_CAST")
val mySet: MutableSet<Int> = getPropertyByName(SomeObject, "a") as MutableSet<Int>
mySet.add(4)
println(mySet)   // Output: [1, 2, 3, 4]

可能不直接适用于您的用例,但这里有一些不需要黑魔法的惯用替代方法:

class MyObject {
var a: MutableSet<String> = mutableSetOf("foo")
var b: MutableSet<String> = mutableSetOf("bar")
}
val obj = MyObject()
// Get via property reference
val property = MyObject::a
println(property.get(obj))
// Get via lambda that returns the property value
val accessor : MyObject.() -> MutableSet<String> = { a }
println(obj.accessor())

在这两种情况下,不是传递一个包含属性名称的String,而是传递一段访问属性的代码。

最新更新