문제

좋아, 그래서 나는 제품, 제품을 물려받는 키티 템 클래스 및 kititem을 상속하는 packageKititem 클래스라는 추상적 인 기본 클래스를 가지고 있습니다. 즉.

Product
KitItem : Product
PackageKitItem : KitItem

나는 키트 템즈를로드했으며 효과적으로 얕은 키티 템 사본 인 PackageKititems 모음을로드해야합니다.

현재 우리는 제품 생성기의 해킹 된 얕은 사본을 나에게 느끼는 일을하고 있습니다.

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();

그러나 나는 유효하지 않은 캐스트를받습니다. 나는 이것을 달성하는 가장 좋은 방법에 대한 아이디어를 찾고 있습니다.

도움이 되었습니까?

해결책

당신이 가진 문제는 shallowcopy ()가 kititem의 멤버이기 때문에 memberwiseclone ()는 kititem 필드를 복사하고 원래 객체가 packageKititem이더라도 키티 템을 반환한다는 것입니다.

이 상황에서해야 할 일이 Kititem에 추가됩니다.

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

그리고 packageKititem에서 :

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

따라서 얕은 코피 ()를 시도하는 객체에 따라 적절한 memberwiseclone () 호출이 완료됩니다.

더 나아가고 싶다면 제품의 얕은 코피 ()를 정의 한 다음 (제품 반환) Kititem과 PackageKititem에서 각각의 얕은 사본을 반환하는 버전을 재정의 할 수 있습니다.

다른 팁

이상하게도 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;

}

제품 생성기에서 이미 얕은 사본의 형태를하고 있습니까? 생성자를 덮어 쓰지 않은 경우 키트 템을 매개 변수로 수신하는 새로운 PackageKititem 만 만들 수 있어야합니다.

PackageKitItem tempPackKitItem = new tempPackKitItem(kitItem);

어쩌면 나는 당신의 질문을 오해했을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top