scala - 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
?
解决方案
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
推荐阅读
- html - 相对于前面的文本元素定位 SVG 文本元素,没有硬 x/y 坐标?
- python - Python打印复选框值
- reactjs - TypeError:countrys.map 不是 react js 中的函数(当我点击国家视图或编辑然后国家链接时)
- reactjs - 构建一个选择选项下拉列表:对象作为 React 子项无效
- node.js - 如何使用节点和/或快递将 3D 模型文件发送到客户端?
- react-native - 更新由 RNSVGReact 管理的视图的属性“填充”时出错
- c# - 如果 value 小于零,则将 nullable int 设置为零
- laravel - 在字符串 laravel 5.8 上调用成员函数 all()
- javascript - 链接和按钮未对齐
- android - 如何从 alertdialog 更改 mainactivity 中的可见性编辑文本