2017-05-20 9 views
1

에서 만드는 개체는 내가 데이터 클래스라는 이름의 회원이있다. 파일의 각 행에는 회원을 인스턴스화하는 데 사용할 필드가 들어 있습니다.코 틀린 반사 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 파일에서 채워진 목록에서 선택됩니다. 테스트 범위가 확장되고 추가 기준 (및 멤버 클래스 필드)이 추가 될 때 유지 관리 오버 헤드를 줄이기 위해이 방식으로 멤버 개체를 만들려고합니다.

왜 내가 이러는 방식으로하고 있습니까? 나는 아직도 배울 것이 많기 때문에 ... (더 나은 방법을 보게되면 제게 교육하십시오.)

고마워요!

답변

0

이 문제를 해결하는 가장 간단한 방법은 리플렉션을 전혀 사용하지 않는 것입니다. 당신은 클래스 생성자에 직접 속성 값을 전달할 수 있습니다 : 객체를 만든 후가 변경 될 수 있도록

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로 선언 할 필요 .

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) 
    } 
} 
+0

클래스의 속성을 반복하고 각각을 설정 거기다 : 그럼 당신은 속성 값을 변경하려면 속성 개체의 set 방법을 사용할 수 있습니까? –