int приведен как объект в свойствах равен 0, когда ноль - PullRequest
0 голосов
/ 28 февраля 2019

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

Я использую следующий код, чтобы упростить обновление определенных значений свойств конфигурации.Обратите внимание, что свойства config - это не просто целые числа, а их не просто 2, они просто упрощены для этого примера.

public class Config {
    public int VarA { get; set; }
    public int VarB { get; set; }
}
private Config config;
private void Update(Config newValues) {
    PropertyInfo[] properties = typeof(Config).GetProperties();
    foreach (PropertyInfo property in properties) {
        object n = property.GetValue(newValues);
        property.SetValue(config, n ?? property.GetValue(config));
    }
}

Метод Update проверяет свойства newValues ​​и обновляет свойства config, еслиопределено значение.

Я инициализирую конфигурацию такими значениями (просто пример):

config = new Config() { VarA = 1, VarB = 2 };
Debug.WriteLine(config.VarA + " : " + config.VarB); // 1 : 2

Тогда, если я только хочу обновить VarA до значения 0, а некоснитесь VarB, я делаю это:

Update(new Config() { VarA = 0 });
Debug.WriteLine(config.VarA + " : " + config.VarB); // 0 : 0

Но это приводит к тому, что VarB также устанавливается на 0, потому что для newValues ​​не было присвоено значение, и нулевое значение, так как int равно 0, потому что int не обнуляемый,Как сделать так, чтобы VarB оставался значением 2, если он не определен в newValues?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Спасибо Джону Скиту, я не знал, что вы могли бы сделать тип значения обнуляемым, поэтому работает следующее:

public class Config {
    public int? VarA { get; set; }
    public int? VarB { get; set; }
}

Я знаю, что другой ответ может работать в некоторых случаях, но я 'Я заполняю эти свойства конфигурации из разных файлов json, и их много, поэтому я бы не хотел вводить их все вручную.

0 голосов
/ 28 февраля 2019

В процедуре обновления для вашего (Config newValues) укажите существующий измененный параметр Config вместо создания нового объекта конфигурации.

Создание нового объекта Config сбрасывает все существующие значения.

config = new Config() { VarA = 1, VarB = 2 }; 
Debug.WriteLine(config.VarA + " : " + config.VarB);

config.VarA = 0;
Update(config);
Debug.WriteLine(config.VarA + " : " + config.VarB);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...