首页 > 解决方案 > Scala - 获取对象属性名称的字符串表示,而不是值,以进行比较

问题描述

我希望能够获取对象属性名称的字符串表示,而不是属性值,以便我可以将它与条件语句中的变量值进行比较。

case class CustomObj(name: T)
case class PropertyObj(property: String)

val custObj = CustomObj("Chris")
val propObj = PropertyObj("name")

if(propObj.property.equals(custObj. /* the property name as a String, so "name", not the value ("Chris"*/)) {
    // do something
}

我怎样才能访问本质上是属性的关键CustomObj

标签: scalaproperties

解决方案


custObj我假设您在编译时不知道类型。然后你必须在 Scala 2.12 中使用运行时反射。

scala> case class CustomObj(name: String)
defined class CustomObj

scala> val custObj: Any = CustomObj("Chris")
custObj: Any = CustomObj(Chris)

scala> import scala.reflect.runtime.currentMirror
import scala.reflect.runtime.currentMirror

scala> val sym = currentMirror.classSymbol(custObj.getClass)
sym: reflect.runtime.universe.ClassSymbol = class CustomObj

scala> val props = sym.info.members.collect{ case m if m.isMethod && m.asMethod.isCaseAccessor => m.name.toString }
props: Iterable[String] = List(name)

scala> if (props.exists(_ == "name")) println("ok")
ok

推荐阅读