Извините, я не смог придумать лучшего названия для описания проблемы.
Я использую следующий код, чтобы упростить обновление определенных значений свойств конфигурации. Обратите внимание, что свойства конфигурации — это не просто целые числа, и их не просто 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 = 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?
«Но это приводит к тому, что VarB также устанавливается в 0, потому что для newValues не было назначено значение, а нулевое значение, поскольку int равно 0, потому что int не может быть нулевым». Ну вроде. Дело не в том, что «нулевое значение, поскольку int равно 0», а в том, что «значение по умолчанию для int равно 0».
Но в принципе, если вы хотите использовать «null» для «не было установлено», тогда все ваши свойства должны быть ссылочными типами или типами значений, допускающими значение NULL.
@HimBromBeere Это просто упрощенный пример. Эти свойства сначала заполняются из разных файлов json, затем я сравниваю одно с другим, чтобы проверить измененные значения и обновить их, но переменная зависит от того, определено/изменено ли конкретное свойство.





В процедуре обновления для вашего параметра (Конфигурация новых значений) укажите существующий измененный параметр конфигурации вместо создания нового объекта конфигурации.
Создание нового объекта конфигурации сбрасывает все существующие значения.
config = new Config() { VarA = 1, VarB = 2 };
Debug.WriteLine(config.VarA + " : " + config.VarB);
config.VarA = 0;
Update(config);
Debug.WriteLine(config.VarA + " : " + config.VarB);
Спасибо, Джон Скит, я не знал, что вы можете сделать тип значения обнуляемым, поэтому работает следующее:
public class Config {
public int? VarA { get; set; }
public int? VarB { get; set; }
}
Я знаю, что в некоторых случаях может работать другой ответ, но я заполняю эти свойства конфигурации из разных файлов json, и есть много свойств, поэтому я бы не хотел вводить их все вручную.
Почему вы Создайте новый
Configи все, что вы хотите сделать, это изменить его? Почему бы просто не использоватьUpdate("VarA", 1)на существующийConfig?