Legen Sie Objekteigenschaftswerte basierend auf einer anderen Eigenschaftsinstanz fest
Posted: 29 Dec 2024, 10:53
Ich habe zwei Instanzen einer Klasse, in denen ich alle Werte in einer Instanz durch die einer anderen Instanz ersetzen möchte, um die Rückgängig-Funktionalität zu implementieren.
Im folgenden Beispiel _selectedMessage enthält die ursprünglichen Werte und selectedMessage enthält die geänderten Werte, die ich auf die in _selectedMessage enthaltenen Werte zurücksetzen möchte ( ist ein MemberwiseClone() von selectedMessage)
Dies wäre der einfachste Weg, außer dass es nicht funktioniert:
Dies funktioniert, würde aber die Auflistung aller Felder erfordern:
Auf dieser Grundlage versuche ich, die Modelleigenschaften zu durchlaufen, um sie festzulegen, ohne sie alle explizit auflisten zu müssen, außer aus irgendeinem Grund funktioniert es nicht, aber ich denke, es muss nah dran sein.< /p>
Mit der obigen Schleife werden keine Werte zurückgeändert, aber es gibt auch keine Fehler.
Was könnte ich falsch machen?Um etwas Kontext dazu hinzuzufügen, warum ich das mache, habe ich ein Blazor WASM QuickGrid, das die Liste der Datensätze anzeigt:
[img]https:/ /i.sstatic.net/oTKHaKoA.png[/img]
Wenn der Benutzer dann einen Datensatz ohne die unten hinzugefügte Lösung öffnet, werden alle Änderungen am Datensatz sofort im Raster dahinter widergespiegelt, sodass das Formular zwar über Schaltflächen zum Speichern und Abbrechen verfügt, während zum Abbrechen Schaltflächen vorhanden sind Aktualisiert die Datenbank nicht, sondern lässt den Datensatz so aussehen, als wäre er im Raster geändert worden. Ich muss also abbrechen, um ihn wiederherzustellen:
[img]https://i .sstatic.net/Um8FQVQE.png[/img]
Was ich jetzt mache, ist, das Objekt auf das temporäre Objekt zu klonen, wenn das Bearbeitungsformular geöffnet wird, das temporäre Objekt für das Formular als Ziel auszuwählen und dann, nachdem ich bestätigt habe, dass die Remote-API-Datenbank gespeichert wurde Erfolgreich, Festlegen der Hauptobjekteigenschaften auf die temporären Eigenschaften. Auf diese Weise wird das Raster nicht verändert, sodass Abbrechen das Formular jetzt einfach schließen kann.
Im folgenden Beispiel _selectedMessage enthält die ursprünglichen Werte und selectedMessage enthält die geänderten Werte, die ich auf die in _selectedMessage enthaltenen Werte zurücksetzen möchte (
Code: Select all
_selectedMessage
Dies wäre der einfachste Weg, außer dass es nicht funktioniert:
Code: Select all
selectedMessage = _selectedMessage;
Code: Select all
selectedMessage.Subject = _selectedMessage?.Subject;
Code: Select all
PropertyInfo[]? properties = _selectedMessage?.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(selectedMessage);
selectedMessage?.GetType().GetProperty(propertyName)?.SetValue(selectedMessage, propertyValue);
}
}
Was könnte ich falsch machen?Um etwas Kontext dazu hinzuzufügen, warum ich das mache, habe ich ein Blazor WASM QuickGrid, das die Liste der Datensätze anzeigt:
[img]https:/ /i.sstatic.net/oTKHaKoA.png[/img]
Wenn der Benutzer dann einen Datensatz ohne die unten hinzugefügte Lösung öffnet, werden alle Änderungen am Datensatz sofort im Raster dahinter widergespiegelt, sodass das Formular zwar über Schaltflächen zum Speichern und Abbrechen verfügt, während zum Abbrechen Schaltflächen vorhanden sind Aktualisiert die Datenbank nicht, sondern lässt den Datensatz so aussehen, als wäre er im Raster geändert worden. Ich muss also abbrechen, um ihn wiederherzustellen:
[img]https://i .sstatic.net/Um8FQVQE.png[/img]
Was ich jetzt mache, ist, das Objekt auf das temporäre Objekt zu klonen, wenn das Bearbeitungsformular geöffnet wird, das temporäre Objekt für das Formular als Ziel auszuwählen und dann, nachdem ich bestätigt habe, dass die Remote-API-Datenbank gespeichert wurde Erfolgreich, Festlegen der Hauptobjekteigenschaften auf die temporären Eigenschaften. Auf diese Weise wird das Raster nicht verändert, sodass Abbrechen das Formular jetzt einfach schließen kann.