Angenommen, ich habe zwei Klassen mit derselben Schnittstelle:
%Vor%Angenommen, ich habe eine Instanz von ISomeInterface, die eine SomeClass darstellt. Gibt es eine einfache Möglichkeit, das in eine neue Instanz von SomeOtherClass zu kopieren, ohne jedes Mitglied von Hand zu kopieren?
UPDATE: Für den Datensatz versuche ich nicht , die Instanz von SomeClass in die Instanz von SomeOtherClass zu konvertieren. Was ich gerne tun würde, ist etwa so:
%Vor%Ich möchte das nicht für jedes von Hand machen müssen, da diese Objekte viele Eigenschaften haben.
"Würdest du mir ein Beispiel geben, wie ich das machen kann (oder zumindest auf die richtigen Methoden hinweisen)? Ich kann sie nicht auf MSDN finden" - Jason Bäcker
Jason, etwas wie das Folgende:
%Vor%Ich würde vorschlagen, ein Werkzeug zu schreiben, um den Code auszuspucken, den Sie für einen Kopierkonstruktor brauchen, anstatt es zur Laufzeit reflektiv zu machen - was weniger performant wäre.
Sie können implizite Operatoren in jeder Klasse erstellen, um die Konvertierung für Sie durchzuführen:
%Vor% und dann SomeOtherClass soc = sc;
und umgekehrt würden funktionieren.
Ist das nicht der Punkt einer Schnittstelle, um das nicht zu tun? Machst du etwas mit der konkreten Implementierung von SomeOtherClass? Anstatt die konkrete Implementierung zu verwenden, verwenden Sie die Schnittstelle und es sollte keine Rolle spielen, wenn Sie SomeClass oder SomeOther Klasse verwenden.
Abgesehen davon ist es am besten, wenn Sie eine Art Hilfsfunktion schreiben (Sie müssen es immer noch manuell tun oder nachdenken), die jede Eigenschaft auf der Oberfläche kopiert, die so aussehen würde:
%Vor%Mein erster Instinkt wäre jedoch zu sagen, dass Sie sich von der Implementierung fernhalten und sich stattdessen auf Ihr Interface konzentrieren sollten, dann ist es egal, was darunter liegt.
Reflexion ... Schleife durch jede Eigenschaft und setze sie auf die entsprechende Eigenschaft auf dem anderen Objekt.
Sieh dir Joes Antwort für die Reflection-Lösung an.
Ich nehme an, dass Sie Visual Studio verwenden.
Kennen Sie die Tastenkombinationen Strg + Umschalt + R und Strg + Umschalt + P? Wenn nicht, beginnt / beendet ctrl + shift + r die Aufzeichnung eines Tastendruck-Makros. ctrl + shift + p spielt das aufgezeichnete Makro ab.
Was ich getan habe, als ich viele Eigenschaften eingestellt habe, ist, die Eigenschaftsdeklarationen dorthin zu kopieren, wo sie gesetzt werden sollen, und ein Makro aufzuzeichnen, um die Deklaration in eine set-Anweisung umzuwandeln und den Cursor in die nächste Zeile zu bewegen , dann spiele ich es einfach, bis ich alle gesetzten Anweisungen erledigt habe.
Nein, um ein Objekt transparent von einem Typ in einen anderen umzuwandeln, muss die zugrundeliegende konkrete Klasse des Objekts, das Sie haben, von der Klasse erben, in die Sie es umwandeln wollen, selbst wenn beide dasselbe implementieren Schnittstelle.
Denken Sie darüber nach, dass alle zwei Objekte, die dieselbe Schnittstelle implementieren müssen, dieselbe Untermenge von Methodensignaturen sind. Sie haben möglicherweise (wahrscheinlich nicht) sogar die gleichen Eigenschaften oder Datenfelder.
würde das nicht funktionieren?
%Vor%Sie müssen nur anrufen: MyClass.Clone ().
Ich mochte das Folgende und es funktioniert nur sehr gut, um von einem Objekt in ein anderes mit implizitem Operator zu konvertieren:
%Vor%