Kotlin反射 – 从CSV创建对象

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