Scala 如何在运行时枚举无形状记录和访问字段键?

Scala 如何在运行时枚举无形状记录和访问字段键?,scala,record,shapeless,Scala,Record,Shapeless,我正在编写处理case类实例列表的通用代码, 收集每个字段中的值,进行组合,然后将其传递给库 使用无形状的LabelledGeneric和多态函数,它看起来如下所示: object toNamedSingletonListOfValues extends Poly1 { implicit def caseField[K,T] = at[FieldType[K, T]](field => { field.key -> List[T](field) }) } val ge

我正在编写处理case类实例列表的通用代码, 收集每个字段中的值,进行组合,然后将其传递给库

使用无形状的
LabelledGeneric
和多态函数,它看起来如下所示:

object toNamedSingletonListOfValues extends Poly1 {
  implicit def caseField[K,T] = 
    at[FieldType[K, T]](field => { field.key -> List[T](field) })
}

val generic = LabelledGeneric[MyClass]
val records = listOfMyClassInstances.map(generic.to)
val values = records.map(_.map(toNamedSingletonListOfValues)) // Then combining and passing
但是,我需要一种获取
field.key
的方法,因为库需要参数名


你介意提出解决方案吗?

发现肮脏的黑客行为是让Poly看起来像:

import scala.reflect.runtime.universe._

object toNamedSingletonListOfValues extends Poly1 {
  implicit def caseField[K: TypeTag, T] = at[FieldType[K, T]] { field =>
    (typeOf[K] match { case TypeRef(_, _, args) => args }).last.toString.drop("java.lang.String(\"".size).dropRight(2) -> List[T]()
  }
}
有更好的解决方案吗?

您可以通过
Witness
类型类的实例访问密钥(在编译时已知)作为运行时值:

object toNamedSingletonListOfValues extends Poly1 {
  implicit def caseField[K, T](implicit wk: Witness.Aux[K]) = 
    at[FieldType[K, T]](field => { wk.value -> List[T](field) })
}

不需要运行时反射

谢谢大家!!我现在还有一些东西要重写,但它实际上让我有了进步。顺便说一句,我试着使用Aux'es,但是,我无法从我需要使用的对象中找出Aux。Aux没有文档,而且几乎不可能从不成形的源代码中推断出这方面的知识,因为Aux定义分散在所有不成形的源代码文件中。
Aux
类型都与特定的类型类配对,旨在将类型成员升级为类型参数。您可以使用
wk:Witness{typet=K}
编写此代码,但是
Aux
版本更好。