Kotlin 将字符串与对象属性匹配
我有一组策略要与请求匹配。如果策略存在,我想匹配请求并查看值是否匹配 策略是List->key:String,value:String,请求可以包含不同的键 例如: 策略是请求应匹配的一组规则Kotlin 将字符串与对象属性匹配,kotlin,Kotlin,我有一组策略要与请求匹配。如果策略存在,我想匹配请求并查看值是否匹配 策略是List->key:String,value:String,请求可以包含不同的键 例如: 策略是请求应匹配的一组规则 class Policy { val key: String, val value: String } 请求是一个包含不同值的数据类,所有值都是可选的,例如姓氏、名字、地址、++++ data class Request ( id: Long = 12, firstName:
class Policy {
val key: String,
val value: String
}
请求是一个包含不同值的数据类,所有值都是可选的,例如姓氏、名字、地址、++++
data class Request (
id: Long = 12,
firstName: String = "test",
surname: String = "test",
address: String = "somewhere"
...// more fields
)
策略列表可以如下所示:
List<Policy> => [
{
key: "surname",
value: "test"
},
{
key: "firstName",
value: "test"
}
]
我不知道如何将策略与请求匹配。Policy.key是一个字符串,请求可以包含所有不同的属性变体
如何将策略列表与我的数据类请求相匹配?对于您的钱包,您需要使用反射,以便按名称查找字段并获取值,或者更改模型中的某些内容 具有反射的解决方案可以如下所示:
data class Policy(
val key: String,
val value: String?
)
data class Request(
val id: Int,
val firstName: String? = null,
val surname: String? = null,
val address: String? = null
)
class PolicyException : Exception()
fun checkPolicies(request: Request, policies: List<Policy>) {
policies.forEach { policy ->
val member = request::class.members.find { member -> member.name == policy.key }
val requestMemberValue = member?.call(request)
if (requestMemberValue != policy.value) throw PolicyException()
}
}
fun main(args: Array<String>) {
println("Hello, reflection!")
checkPolicies(Request(id = 0, firstName = "Johnn"), listOf(Policy("firstName", "John")))
}
此外,我还更改了策略模型以处理可为null的值,并且仍然正确地将null作为字符串处理
但是,使用此解决方案,在更改模型名称时必须非常小心。记住不要混淆你的模型
另外,更好的解决方案是添加注释,将策略名称保留为注释属性,然后在应用程序中更改字段名称的问题将消失。为什么不将伪代码转换为代码?我们不知道你的类是什么样子的,所以除了你已经拥有的伪代码之外,很难产生其他东西,因为我不知道如何实现这个。我不知道如何将Policy.key字符串与Request.property匹配。我们也不知道,因为您没有发布类。@jbnize没有添加我的两个类。但是仍然没有关于如何匹配它的线索。好的。实际上,你需要反思来做你想做的事情,这通常是个坏主意。如果可能的话,最好的做法可能是更改策略类,这样它就可以存储一个函数,允许获取请求的属性,而不是存储属性名,即请求->任何。或者请求类应该是一个带有键和值的映射。这些要求和政策来自哪里?它们是如何产生的?