Kotlin:我能用变量得到一个对象里面的对象吗?变量的值是一个对象的名字,

bxjv4tth  于 2023-01-26  发布在  Kotlin
关注(0)|答案(2)|浏览(107)

通常我使用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吗?

编辑

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

ar5n3qh5

ar5n3qh51#

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]
xfyts7mz

xfyts7mz2#

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

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

相关问题