Ich habe 2 Sammlungen von 2 verschiedenen Arten, aber habe fast die gleiche Menge von Feldern. In einer Funktion muss ich eine der Sammlungen durchlaufen, abhängig von einer Bedingung. Ich möchte nur einen Codeblock schreiben, der beide Fälle abdeckt. Beispiel: Ich habe den folgenden Code:
%Vor%Jetzt: Ich möchte diesen Code vereinfachen, um die gleiche Logik nur einmal zu verwenden (da sie identisch sind), etwas wie folgt (PS: Ich weiß, dass der folgende Code nicht korrekt ist, ich erkläre nur, was ich tun möchte ):
%Vor%Die Definition von Type1 & amp; Type2 ähnelt dem folgenden Code (Tatsächlich sind sie Entity-Objekte):
%Vor%Update 1:
Ich habe einen Beispielcode eingefügt, den ich innerhalb von foreach block verwende (ich greife auf öffentliche Eigenschaften der beiden Typen zu).
Update 2:
Ich habe Probe Type1 & amp; Type2-Definitionen, wie Sie sehen können Ich habe 2 gemeinsame öffentliche Eigenschaften in beiden Klassen, die ich in jedem Block aktualisieren möchte.
Update 3:
Es tut mir leid für die Verwirrung, Type1 & amp; Type2 werden von EntityObject abgeleitet (Sie sind beide Teil meines Entitätsmodells und die Type1Collection & amp; Type2Collection sind tatsächlich EntityCollection dieser 2 Entitäten.
Da Jon Skeet die Methode Concat
von LINQ verwendet und die Anweisung des OP, dass die beteiligten Klassen EntityObject
s sind, ist hier eine weitere mögliche Lösung. Dies setzt voraus, dass die Unterklassen EntityObject
als partielle Klassen definiert sind:
Dies ermöglicht dem OP, eine Schnittstelle mit den allgemeinen Eigenschaften zu deklarieren, und seine EntityObject
-Unterklassen implementieren diese Schnittstelle:
Und der ursprüngliche Code wird:
%Vor%Sie könnten einen Basistyp für type1 und type2 erstellen, der die gemeinsamen Eigenschaften zwischen den beiden Klassen gruppiert:
%Vor%Dann könnten Sie so etwas tun:
%Vor%BEARBEITEN: Wie Simon in den Kommentaren betont, sollten Sie anstelle eines Basistyps eine Schnittstelle verwenden, wenn dies ausreicht (d. H. Sie benötigen für beide Typen keine spezifische Implementierung).
Das ist keine sehr schöne Methode, aber es würde zumindest funktionieren.
%Vor%Ich bin überrascht, dass noch niemand eine Erweiterungsmethode vorgeschlagen hat:
%Vor% Nun müssen Ihre Originaltypen nur IMyType
implementieren:
Dann wird der ursprüngliche Code:
%Vor%Sie können dies mit Prädikat und Aktion tun, die in einem Dictionary gespeichert sind. Ich schlage Action vor, da das Code-Snippet anscheinend nichts zurückgibt.
%Vor%Auf diese Weise verbessert sich die Lesbarkeit und Testbarkeit Ihres Codes und vermeidet auch lange Methoden.
Bearbeiten:
%Vor%Tags und Links c# entity-framework