csv - Kotlin 反射 - 从 CSV 创建对象

标签 csv reflection kotlin

我有一个名为 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/

相关文章:

android - 一次在 kotlin 中迁移整个 android 项目是否安全?

c - C 动态结构数组中的动态结构数组

python - Pandas 解析 csv 错误 - 预期 1 个字段找到 9

c# - 如何按值中的子字符串对 Dictionary<string,string> 进行排序?

php - 在 PHP 中,有没有办法在特定命名空间中获取所有声明的类?

java - 如果一个值是由类 java.lang.reflect.Field 的 'set' 方法设置的,它是否具有并发可见性?

java - 反射找不到对象子类型

android - Kotlin 库是用较新的 Kotlin 编译器编译的,无法读取

kotlin - 撰写导航后退按钮未显示

python - 将多个数据框合并在一起