У вас есть ошибка, потому что когда вы делаете this[propName] = value
, вы пытаетесь использовать this
в качестве списка, но это не список, это Person
, и он не перегружает оператор []
.
Что вы можете сделать, это добавить проверку установленного свойства:
class Person {
privavar name:String? = null
var age:Int? = null
fun setter(propName:String, value:Any): Person{
return this.apply {
if (propName == "name" && value is String?) {
it.name = value as String?
} else if (propName == "age" && value is Int?) {
it.age = value as Int?
} else {
// handle unknown property or value has incorrect type
}
}
}
}
Еще одно более динамичное решение без отражения:
class Person {
private var fields: Map<String, Any?> = HashMap()
fun setter(propName:String, value:Any): Person{
return this.apply {
it.fields[propName] = value;
}
}
fun getName() = fields["name"]
}
Если вы также хотите избавиться от геттеров, вам нужно использовать отражение.