我有一个名为 Member 的数据类:
data class Member(){
val first_name: String
val last_name: String
//30 more
//a few simple methods
}
我正在尝试导入 CSV 文件。文件的每一行都包含我想用来实例化我的成员的字段。
fun ReadCsvFileKotlin() {
val csvFile = "C:\\Data.csv"
var memberList = mutableListOf<Member>()
var reader = File(csvFile).readLines()
var mbr: Member
class Member(val p: Int)
val prop = Member::p
for(line in reader){
val mbrProperties = line.split(",")
for(i in 0..mbrProperties.lastIndex){
//assign mbrProperties[i] to mbr property
//mbrProperties[0] = "Bob"
//mbr.first_name = "Bob"
//Member::p = mbrProperties[i]
}
memberList.add(mbr)
}
我已经完成了研究,但我无法全神贯注于我所阅读的信息,而且无法弥合我所处的位置和我想要的位置之间的差距。
如有任何建议,我们将不胜感激!欢迎使用我的示例代码引导我完成或给我示例。
背景:我正在为一个网站自动化测试。在执行每个测试之前,满足必要测试标准的成员是从列表中选择的,该列表从 CSV 文件中填充。我希望以这种方式创建我的成员对象,以在测试范围扩大和添加其他条件(和成员类字段)时减少维护开销。
为什么我要以现在的方式做这些?因为我还有很多东西要学...(所以,如果你看到更好的方法,请不吝赐教!)
谢谢!
最佳答案
解决这个问题最简单的方法就是根本不使用反射。您可以将属性值直接传递给类构造函数:
data class Member(val firstName: String, val lastName: String)
fun readCsvFileKotlin() {
// ...
for (line in reader) {
val mbrProperties = line.split(",")
memberList.add(Member(mbrProperties[0], mbrProperties[1]))
}
}
如果要通过反射设置属性,需要将它们声明为var
而不是val
,这样它们就可以在对象创建后改变。然后您可以使用属性对象上的 set
方法来更改属性值:
data class Member(var firstName: String? = null, var lastName: String? = null)
fun readCsvFileKotlin() {
// ...
val prop = Member::firstName
for (line in reader) {
val mbrProperties = line.split(",")
val member = Member()
prop.set(member, mbrProperties[0])
memberList.add(member)
}
}
关于csv - Kotlin 反射 - 从 CSV 创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44086665/