Получить значение свойства класса с помощью JsonProperty - PullRequest
0 голосов
/ 08 апреля 2020

Для настроек среды мы храним JSON BLOB-объектов в нашей БД, таких как:

[
  {
    "env": "local",
    "keya": "valueA_local"
    "keyb": "valueB_local"
  },
  {
    "env": "development",
    "keya": "valueA_dev"
    "keyb": "valueB_dev"
  },
  {
    "env": "qa",
    "keya": "valueA_qa"
    "keyb": "valueB_qa"
  }
]

И у нас есть перечисление:

public enum EnvironmentSettings
{
    KeyA = 1,
    KeyB = 2,
}

И у нас есть класс :

[Serializable]
public class MyProjectEnvironmentSettings
{
    [JsonProperty("env")]
    public string Environment { get; set; }

    [JsonProperty("keya")]
    public string KeyA{ get; set; }

    [JsonProperty("keyb")]
    public string KeyB{ get; set; }
}

И, наконец, мне нужно создать метод, который возвращает значение для данной пары. Мне бы хотелось, чтобы этот метод не нужно было изменять, если добавлен новый параметр.

public string GetEnvironmentSetting(EnvironmentSettings environmentSetting)
{
    List<MyProjectEnvironmentSettings> environmentSettings = //  get the entire list from the DB
    string envName = // get environment
    string keyToGet = environmentSetting.ToString().ToLower();

    // This will get the group of settings specific to the environment
    var envSettings = environmentSettings.Where(e => e.Environment.ToLower() == envName).FirstOrDefault();

    // And last, I need to get the value for the specific setting that is being requested 
    string settingValue = envSettings.Where(e => e.???? == keyToGet );  // <---------- This is where I need help!
}

Я не уверен, как выполнить запрос по атрибуту JsonProperty.

Спасибо!

1 Ответ

2 голосов
/ 08 апреля 2020

Вы можете использовать отражение.

var property = typeof(MyProjectEnvironmentSettings)
    .GetProperties()
    .FirstOrDefault(prop => prop
        .GetCustomAttribute<JsonPropertyAttribute>()?.PropertyName == keyToGet);
string settingValue = property?.GetValue(envSettings);

Возможно, вам придется добавить BindingFlags, если вы измените доступность ваших свойств.


Таким образом, у вас не будет чтобы изменить ваш GetEnvironmentSetting метод, но вам все равно нужно будет обновлять ваше перечисление и свойства вашего класса каждый раз, когда вы добавляете что-то.

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

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