I donβt know exactly what you had in mind, but the match operator could do this, it is not very general or extensible with respect to changes in the case Person class, but it meets your basic requirements without using reflection:
scala> val a = Person("test",10) a: Person = Person(test,10) scala> def extract(p: Person, fieldName: String) = { | fieldName match { | case "name" => p.name | case "age" => p.age | } | } extract: (p: Person, fieldName: String)Any scala> extract(a, "name") res1: Any = test scala> extract(a, "age") res2: Any = 10 scala> extract(a, "name####") scala.MatchError: name
UPDATE according to comment:
scala> case class Person(name: String, age: Int) defined class Person scala> val a = Person("test",10) a: Person = Person(test,10) scala> def extract(p: Person, fieldName: String) = { | fieldName match { | case "name" => Some(p.name) | case "age" => Some(p.age) | case _ => None | } | } extract: (p: Person, fieldName: String)Option[Any] scala> extract(a, "name") res4: Option[Any] = Some(test) scala> extract(a, "age") res5: Option[Any] = Some(10) scala> extract(a, "name####") res6: Option[Any] = None scala>
source share