通过反射的Kotlin枚举



我想知道有没有更好的方法来解析enum当你没有通用的,只有KProperty1<T, *>?

我找到了一个这样的解决方案:

enum Car {
BMW, AUDI
}
val property = properties[fieldName] as? KProperty1<T, *>
val instanceKClass = property.returnType.jvmErasure
if (instanceKClass.java.isEnum) {
parseEnum(property.javaField!!.type as Class<Enum<*>>, "BMW")
}

fun parseEnum(enumClass: Class<Enum<*>>, value: Any?): Enum<*>? {
val enumClz = enumClass.enumConstants
return try {
enumClz.first { it.name == value }
} catch (ignored: Exception) {
throw IlligalArgumentException("there is no such enum")
}
}

我试图通过反射从Kotlin的字符串中提取枚举值,我想找到最好的方法来做到这一点

注:我想请教一下怎样才能做得更有效率,更漂亮,因为我对这种方式不太满意。

这应该适合您正在寻找的内容。此扩展函数将与任何已定义的Enum一起工作,并强制执行正确的类安全。该函数将在非预期值时返回null,并且对字符串格式具有合理的容忍度。

enum class Car {
BMW, AUDI, ASTON_MARTIN;
}
inline fun <reified T: Enum<*>> getEnum(value: String): T? {
val entries = T::class.java.enumConstants
val enumNameFormat = value.uppercase().replace(" ", "_")
return entries.firstOrNull { it.name == enumNameFormat }
}

fun usage() {
val car = getEnum<Car>("BMW")
val caseInsensitive = getEnum<Car>("bmw")
println("Car: $car caseInsensitive: $caseInsensitive")

val underscoreName = getEnum<Car>("Aston_Martin")

println("Aston: $underscoreName")

val notCar = getEnum<Car>("John Deere")

println("Not Car: $notCar")
}
usage()
/*
Car: BMW caseInsensitive: BMW
Aston: ASTON_MARTIN
Not Car: null
*/

相关内容

  • 没有找到相关文章

最新更新