2

好的,所以我有一个名为 Product 的抽象基类,一个继承 Product 的 KitItem 类和一个继承 KitItem 的 PackageKitItem 类。IE。

Product
KitItem : Product
PackageKitItem : KitItem

我已经加载了我的 KitItems,我需要加载 PackageKitItems 的集合,它们实际上是 KitItems 的浅表副本。

目前,我们正在 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));
        }

我试过在 KitItem 上设置一个副本,如下所示:

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

并这样称呼它:

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

但我得到一个无效的演员表。我正在寻找实现这一目标的最佳方法的想法。

4

3 回答 3

4

您遇到的问题是,由于 ShallowCopy() 是 KitItem 的成员,MemberwiseClone() 只是复制 KitItem 字段并返回 KitItem,即使原始对象是 PackageKitItem。

我认为在这种情况下你必须做的添加到 KitItem:

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

在 PackageKitItem 中:

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

因此,根据您尝试 ShallowCopy() 的对象,您将获得正确的 MemberwiseClone() 调用。

如果你想更进一步,你可以在 Product 中定义一个 ShallowCopy() (返回一个 Product),然后在 KitItem 和 PackageKitItem 中覆盖版本,每个版本都返回它们各自的浅拷贝。

于 2008-11-15T19:48:33.713 回答
1

奇怪的是,我在 Visual Studio 2008 上执行此操作时没有出错。我发布了代码,以便您可以看到我缺少什么或我假设的错误。我的猜测是问题出在您没有发布的班级成员之一。

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;

}
于 2008-11-12T14:08:06.437 回答
0

在您的 Product 构造函数中,您已经在做某种形式的浅拷贝,不是吗?如果您没有覆盖您的构造函数,那么您应该能够创建一个新的 PackageKitItem,它接收一个 KitItem 作为其参数。

PackageKitItem tempPackKitItem = new tempPackKitItem(kitItem);

也许我只是误解了你的问题。

于 2008-11-12T14:04:36.910 回答