Установите значения свойств объекта на основе другого экземпляра свойства.C#

Место общения программистов C#
Ответить
Anonymous
 Установите значения свойств объекта на основе другого экземпляра свойства.

Сообщение Anonymous »

У меня есть два экземпляра класса, в которых я хочу заменить все значения в одном экземпляре значениями из другого экземпляра, чтобы реализовать функции сохранения или отмены.
В следующем примере selectedMessage содержит исходные значения, а selectedMessageTemp содержит измененные значения. Я хочу обновить значения, содержащиеся в selectedMessage, если нажата кнопка сохранения, и сохранить существующую запись, если нажата отмена или операция сохранения базы данных не увенчалась успехом (

Код: Выделить всё

selectedMessageTemp
является MemberwiseClone() из selectedMessage)
Это был бы самый простой способ, за исключением того, что selectedMessage не обновляется с измененными значениями как и ожидалось:

Код: Выделить всё

selectedMessage = selectedMessageTemp;
Это работает и приводит к обновлению selectedMessage измененными значениями, но потребует перечисления всех полей, которые могут быть длинными и подвержены ошибкам:< /p>

Код: Выделить всё

selectedMessage.Subject = selectedMessageTemp?.Subject;
Основываясь на том факте, что этот второй подход работает, я пытаюсь выполнить итерацию по полям без необходимости явно перечислять каждое свойство, как указано выше, за исключением того, что selectedMessage не обновляется с измененными значениями но ошибок не возвращается.

Код: Выделить всё

PropertyInfo[]? properties = selectedMessageTemp?.GetType().GetProperties();
if (properties != null)
{
foreach (PropertyInfo property in properties)
{
// Get the name and value of each property
string? propertyName = property.Name;
object? propertyValue = property.GetValue(selectedMessageTemp);

selectedMessage?.GetType().GetProperty(propertyName)?.SetValue(selectedMessageTemp, propertyValue);
}
}
Где я могу ошибаться?
Чтобы добавить некоторый контекст того, почему я это делаю, у меня есть Blazor WASM QuickGrid, который показывает список записей:
Изображение

Тогда, если пользователь открывает запись без Решение, которое я добавил ниже, любые изменения в записи мгновенно отражаются в сетке позади, поэтому, хотя в форме есть кнопки сохранения и отмены, хотя отмена не обновляет базу данных, запись выглядит так, как будто она была изменена в сетке, поэтому мне нужно отменить, чтобы верните его обратно:
Изображение

Сейчас я клонирую объект в временный, когда открывается форма редактирования, нацеливается на временный объект для формы, а затем, после подтверждения успешного сохранения базы данных удаленного API, устанавливает для основных свойств объекта временные свойства. Таким образом, сетка не изменяется, поэтому для отмены можно просто закрыть форму.
P.S. Я отредактировал свой вопрос, чтобы было понятнее, какой экземпляр temp, добавив temp в конец, так как не знаю, почему за него проголосовали.

Подробнее здесь: https://stackoverflow.com/questions/793 ... y-instance
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»