【问题标题】:In Kotlin, is it possible to use a variable to call a method or property?在 Kotlin 中,是否可以使用变量来调用方法或属性?
【发布时间】:2018-08-06 21:23:13
【问题描述】:

简单地说,我有一个变量告诉我需要修改对象的哪个属性,但不能将该属性称为变量。

data class MyDataClass(var one: String, var two: Int)

fun doSomething() {
    myData = MyDataClass("first", 2)

    val propertyImInterestedIn = "one"

    myData.{propertyImInterestedIn} = "second" // How do I do this?

    assertEquals("second", myData.one)
}

【问题讨论】:

  • 您的示例并没有清楚地说明您想要达到的目标,所以我不确定我能否正确回答。是直接引用属性,还是需要通过值来查找?
  • 抱歉,我发现一个错字。我已经纠正了。我需要设置名为“one”的属性。但是,在编译时,我不知道该属性的名称是什么。当然,这个例子是人为的。实际上,propertyImInterestedIn 会被计算出来。

标签: variables properties kotlin evaluation


【解决方案1】:

如果您可以直接引用字段,则可以在编译时执行此操作,或者在运行时执行此操作,但您将失去编译时安全性:

// by referencing KProperty directly (compile-time safety, does not require kotlin-reflect.jar)
val myData = MyDataClass("first", 2)
val prop = myData::one
prop.set("second")

// by reflection (executed at runtime - not safe, requires kotlin-reflect.jar)
val myData2 = MyDataClass("first", 2)
val reflectProp = myData::class.memberProperties.find { it.name == "one" }
if(reflectProp is KMutableProperty<*>) {
    reflectProp.setter.call(myData2, "second")
}

【讨论】:

    【解决方案2】:

    您可以使用 Kotlin 反射 API 来执行此操作,尤其是 bound callable references

    val propertyImInterestedIn = myData::one
    propertyImInterestedIn.set("second")
    

    请注意,您需要将 kotlin-reflect 作为依赖项添加到您的项目中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 2021-04-13
      • 1970-01-01
      相关资源
      最近更新 更多