Сопоставить строку со свойством объекта - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть набор политик, которым я хочу соответствовать запрос.Если политика существует, я хочу сопоставить запрос и посмотреть, соответствует ли значение.

Политики: List<Policies> -> (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 является строкой, и запрос может содержать все различные варианты свойств.

Как сопоставить Список политик с моим классом данных Request?

1 Ответ

0 голосов
/ 26 ноября 2018

Для ваших целей вам нужно использовать отражение (вы хотите найти поле по имени и получить значение) или изменить что-то в вашей модели.

Решение с отражением может быть следующим:

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 (и все еще правильно обрабатывал «ноль» как строку).

Но с этим решением вы должны быть очень осторожны с изменением названий моделей.И помните, чтобы не запутывать ваши модели.

Кроме того, гораздо лучше добавить аннотацию, в которой имя политики сохраняется как свойство аннотации (тогда проблема с изменением имени поля в приложении исчезнет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...