通常我使用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,而是传递一段访问属性的代码。