2 Stimmen

Gibt es eine Möglichkeit, diesen C#-Vergleichscode allgemeiner zu gestalten?

Ich vergleiche zwei Objekte desselben Typs und gebe die Unterschiede in einer Liste von FieldChange Objekte. Im Moment liste ich die einzelnen Feldvergleiche so auf, was etwas suboptimal erscheint.

Gibt es eine sauberere Möglichkeit, den nachstehenden Code so umzugestalten, dass die Wiederholungen vermieden werden? Es gibt zwei Sätze von Code unten, aber in Wirklichkeit habe ich etwa 20 Vergleiche.

var changes = new List<FieldChange>();
if (proposedUpdatedProject.StatusId != existingProject.StatusId)
{
    var previousStatusName = existingProject.StatusShortName;
    existingProject.Status = ProjectModel.Repository.Fetch<ProjectStatus>(proposedUpdatedProject.StatusId);
    changes.Add(new FieldChange { FieldName = "Status", PreviousValue = previousStatusName, NewValue = existingProject.StatusShortName });
}

if (proposedUpdatedProject.TechOwnerId != existingProject.TechOwnerId)
{
    var previousTechOwnerName = existingProject.TechOwnerName;
    existingProject.TechOwner = ProjectModel.Repository.Fetch<Person>(proposedUpdatedProject.TechOwnerId);
    changes.Add(new FieldChange { FieldName = "Tech Owner", PreviousValue = previousTechOwnerName, NewValue = existingProject.TechOwnerName });
}   

HINWEIS: alle Objekte sind von demselben Objekt namens BaseObj abgeleitet. Beachten Sie auch, dass ich nicht nur die Werte der vergleichbaren Felder in das FieldChange-Objekt einfüge (Eigenschaft id versus Name)

2voto

Marcel N. Punkte 13388

Sie könnten eine Methode erstellen attribute zum Beispiel genannt ComparableAttribute . Dann können Sie alle Methoden in diesen Objekten mit diesem Attribut ausstatten.

Sie können Reflexion in der Methode verwenden, mit der Sie den Vergleich durchführen, und durch alle Comparable Eigenschaften. Der Code wäre viel kürzer (eine Iteration, statt 20 if Aussagen).

Wenn Sie benutzerdefinierte Informationen für bestimmte Eigenschaften benötigen, können Sie diese über die Option ComparableAttribute Attribut, als Parameter.

Die Vergleichsmethode würde immer noch zwei Instanzen als Parameter annehmen, aber die Implementierung wäre viel kleiner. Sie könnten sogar den Cache der PropertyInfo s für Ihre Typen, so dass Sie nicht bei jedem Vergleich nachdenken müssen.

0voto

Andyz Smith Punkte 688

Warum nicht über die Strukturen nachdenken?

existingProject

Und vergleichen Sie alle Felder. Wenn Sie den Code auf diese Weise von Hand schreiben, fügen Sie dem Problem eine ganze Reihe von Informationen hinzu, z. B. die Assoziation zwischen StatusID und StatusName, aber wenn Sie die richtigen Namenskonventionen wählen, können Sie die ganze Sache möglicherweise automatisieren.

0voto

Zasz Punkte 11929

Warum nicht INotifyPropertyChanged Schnittstelle ? Siehe aquí für Informationen darüber. Sie müssen sie nur implementieren und sich für das Ereignis anmelden. Ein weiterer lien

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X