Kotlin 将字符串与对象属性匹配

Kotlin 将字符串与对象属性匹配,kotlin,Kotlin,我有一组策略要与请求匹配。如果策略存在,我想匹配请求并查看值是否匹配 策略是List->key:String,value:String,请求可以包含不同的键 例如: 策略是请求应匹配的一组规则 class Policy { val key: String, val value: String } 请求是一个包含不同值的数据类,所有值都是可选的,例如姓氏、名字、地址、++++ data class Request ( id: Long = 12, firstName:

我有一组策略要与请求匹配。如果策略存在,我想匹配请求并查看值是否匹配

策略是List->key:String,value:String,请求可以包含不同的键

例如:

策略是请求应匹配的一组规则

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没有添加我的两个类。但是仍然没有关于如何匹配它的线索。好的。实际上,你需要反思来做你想做的事情,这通常是个坏主意。如果可能的话,最好的做法可能是更改策略类,这样它就可以存储一个函数,允许获取请求的属性,而不是存储属性名,即请求->任何。或者请求类应该是一个带有键和值的映射。这些要求和政策来自哪里?它们是如何产生的?