Frage

Ok, so habe ich eine abstrakte Basisklasse genannt Produkt, eine KitItem Klasse, die Produkt- und eine PackageKitItem Klasse erbt, die KitItem erbt. dh.

Product
KitItem : Product
PackageKitItem : KitItem

Ich habe meine KitItems geladen und ich brauche eine Sammlung von PackageKitItems zu laden, die sind, effektiv, flache Kopien von KitItems.

Zur Zeit machen wir, was ein Hacky flache Kopie im Produkt Konstruktor mir fühlt sich etwa so:

public Product(Product product)
        {
            FieldInfo[] fields = product.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);

            // copy each value over to 'this'
            foreach (FieldInfo fi in fields)
                fi.SetValue(this, fi.GetValue(product));
        }

Ich habe versucht, eine Kopie auf KitItem Einrichtung wie folgt:

public KitItem ShallowCopy()
        {
            return (KitItem)this.MemberwiseClone();
        }

und nennt es so:

PackageKitItem tempPackKitItem = (PackageKitItem)packKitItem.ShallowCopy();

, aber ich erhalte eine ungültigen Stimmen. Ich bin für Ideen für den besten Weg, um dies zu erreichen.

War es hilfreich?

Lösung

Das Problem, das Sie haben, ist, dass seit shallowCopy () ist ein Mitglied der KitItem, MemberwiseClone () kopiert nur die KitItem Felder und Zurückgeben eines KitItem auch wenn das ursprüngliche Objekt ist ein PackageKitItem.

Ich denke, was Sie in diesem Umstand zu tun haben, in dem KitItem:

public virtual KitItem ShallowCopy()        
{            
  return (KitItem) this.MemberwiseClone();        
}

und in PackageKitItem:

public override KitItem ShallowCopy()        
{            
    return (PackageKitItem) this.MemberwiseClone();        
}

So finden Sie die richtige MemberwiseClone () -Aufruf erledigen je nach Objekt, das Sie shallowCopy versuchen ().

Wenn Sie weiter gehen wollen, können Sie eine shallowCopy () in Produkt definieren (Rückkehr ein Produkt) und dann Versionen in KitItem und PackageKitItem jede Rückkehr ihrer jeweilige flache Kopie außer Kraft gesetzt hat.

Andere Tipps

Seltsamer habe ich nicht einen Fehler tun dies auf Visual Studio 2008. Ich den Code bin Entsendung so können Sie sehen, was ich bin fehlt oder was ich gehe davon aus falsch. Meine Vermutung ist, dass das Problem in einem der Klassenmitglieder ist, die Sie nicht veröffentlichen.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            PackageKitItem PKI = new PackageKitItem();
            PKI.ID      = 1;
            PKI.KitName = "2";
            PKI.Name    = "3";
            PKI.Package = 4;

            PackageKitItem tempPackKitItem = (PackageKitItem)PKI.ShallowCopy();

        }
    }

}

public class Product
{
    public int ID;
    public string Name;

    public Product()
    {
    }

    public Product(Product product)
    {
        FieldInfo[] fields = product.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);

        // copy each value over to 'this'
        foreach (FieldInfo fi in fields)
            fi.SetValue(this, fi.GetValue(product));
    }


}

public class KitItem:Product
{
    public string KitName;
    public KitItem ShallowCopy()
    {
        return (KitItem)this.MemberwiseClone();
    }

}

public class PackageKitItem : KitItem
{
    public int Package;

}

In Ihrem Produkt Konstruktor Sie tun bereits eine Form der flachen Kopie, sind Sie nicht? Wenn Sie Ihren Konstruktor nicht überschrieben haben, dann sollten Sie in der Lage sein, nur eine neue PackageKitItem zu erstellen, die eine KitItem als Parameter erhält.

PackageKitItem tempPackKitItem = new tempPackKitItem(kitItem);

Vielleicht falsch verstehe ich nur Ihre Frage.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top