2011-01-11 13 views
0

Also im Grunde habe ich nach einer Möglichkeit gesucht, ein Objekt zu klonen und seine Eigenschaften zu kopieren, dann fügen Sie eine hinzu. Scheint dumm, eine Klasse zu erstellen, das existierende Objekt zu erben und dann eine Menge von this.prop = obj.prop;Festlegen von Objekteigenschaften von einem anderen Objekt über Reflexion

Ich dachte, es könnte einen einfachen Weg geben, dies mit Reflektion und Schleifen durch die Eigenschaften von obj zu tun, um die Eigenschaften von 'this' zu setzen. Gedanken?

+0

möglich Duplikat von [Wie Wert von Klasse X Klasse Y kopieren mit dem gleichen Name der Eigenschaft in C#?] (http://stackoverflow.com/questions/531505/how-to-copy-value-from-class-x-to-class-y-with-the-same-property-name-in -c) –

Antwort

3

Ja, Sie können es mit Reflexion tun:

http://wraithnath.blogspot.com/2011/01/how-to-copy-and-object-with-reflection.html

    //Copy the properties 
       foreach (PropertyInfo oPropertyInfo in oCostDept.GetType().GetProperties()) 
       { 
        //Check the method is not static 
        if (!oPropertyInfo.GetGetMethod().IsStatic) 
        { 
         //Check this property can write 
         if (this.GetType().GetProperty(oPropertyInfo.Name).CanWrite) 
         { 
          //Check the supplied property can read 
          if (oPropertyInfo.CanRead) 
          { 
           //Update the properties on this object 
           this.GetType().GetProperty(oPropertyInfo.Name).SetValue(this, oPropertyInfo.GetValue(oCostDept, null), null); 
          } 
         } 
        } 
       } 

[1]: http://wraithnath.blogspot.com/2011/01/how-to-copy-and-object-with-reflection.html "

1

Es kommt auf die Art des Klonens an, das Sie wünschen. Wenn Sie flaches Klonen wollen, ist es einfach genug. Durchlaufen Sie die Eigenschaften des Objekts und legen Sie sie auf dem Klon fest. Das bedeutet jedoch, dass Eigenschaften, die Referenzen enthalten, dasselbe Objekt sowohl für die Quelle als auch für den Klon referenzieren.

Wenn Sie einen tiefen Klon wollen, müssen Sie eine Möglichkeit finden, auch Referenzen zu kopieren, die dem Quellobjekt gehören (und Referenzen, die den Referenzen gehören, die der Quelle gehören, usw. usw.). Dies ist möglicherweise nicht automatisch möglich, wenn diese Referenzen keine Standardkonstruktoren haben.

Worauf es hinausläuft ist, dass nach meiner Erfahrung, wenn Sie eine nicht-triviale Klasse und/oder Klassenhierarchie haben (insbesondere mit der Möglichkeit der nicht vorhandenen Standardkonstruktoren), der einfachste, zuverlässigste Weg ist um entweder einen "Copy Constructor" zu schreiben (was in .NET als solcher nicht existiert), und die Arbeit selbst zu machen, implementieren Sie ICloneable, und führen Sie die Arbeit selbst aus, oder implementieren Sie Ihre eigene Art von Clone-Methode und erledigen Sie die Arbeit sich selbst;)

+0

Danke - das ist ein bisschen, was ich dachte, aber dachte, ich würde fragen, bevor Sie hinein tauchen. – Kevin

+0

Reflection ist ein großer Vorteil und eröffnet viele zusätzliche alternative Routen zum Codieren von Dingen. Wie bei den mächtigsten Dingen, ist es einfach, sie zu benutzen, bevor man "normale" Alternativen in Betracht zieht. Ich habe mich in der Vergangenheit schon einige Male von der unbegrenzten Magie der Reflexion gebissen. Seitdem habe ich gelernt, es mit Respekt zu behandeln;) –

0

Wenn die Klassen serialisierbar sind, könnten Sie wahrscheinlich Xml serialization verwenden, um eine Klasse zu serialisieren und dann zu der anderen zu deserialisieren.

Verwandte Themen