2016-04-23 6 views
0

まずはC#を初めて使用しました。私が手
エラーは次のとおりです。C#異なる種類のオブジェクト間のキャスト

追加情報:型のオブジェクトをキャストすることができません「UserGUI.MyItems」は「CommonBookLib.AbstractItem」を入力します。

彼らは2つの異なるクラスである:私が行うときに起こる

public class MyItems 
{ 
    public string ItemName { get; set; } 
    public int CopyNumber { get; set; } 
    public int Guid { get; set; } 
    public DateTime? TimePrinted { get; set; } 
    public string Category { get; set; } 
    public string SubCategory { get; set; } 
    public bool? BestSeller { get; set; } 
} 

public class AbstractItem : IPropsDetails 
{ 
    public int CopyNumber { get; } 
    public string ItemName { get; } 
    public DateTime Time { get; } 
    public int Guid { get; } 

    public AbstractItem(int copyNumber, string itemName, DateTime time, int guid) 
    { 
     this.CopyNumber = copyNumber; 
     this.ItemName = itemName; 
     this.Time = time; 
     this.Guid = guid; 
    } 
} 

:まあ

AbstractItem myItemsList = (AbstractItem)LibraryList.SelectedItem; 
logicManager.Remove(myItemsList); 

、あなたが見ることができるように、私はMyItemsを持っていますを担当しています私のGUIにはデータ・バインド、データはどこに保存されていますか?AbstractItem

私は自分のコードをうまく管理していないので、私はこの状況に陥りました。実際には変更したくありません。MyItems(削除と再コードAbstractItem)。 どのように変換することができますか?

ちなみに、AbstractItemは4つのプロパティしか持っていませんが、MyItemsはそれ以上のものがあります。

しかし、私はAbstractItemとまったく同じプロパティを持つ子供を持っています。

ご協力いただければ幸いです。前もって感謝します!

答えて

5

MyItemsクラスのフィールドも削除してください(AbstractItem)。その後、代わりにMyItemsを派生させてください。

基本コンストラクタに必要な値を渡すコンストラクタをMyItemsに追加するか、空のコンストラクタをベースクラスに追加する必要があります。

public class MyItems : AbstractItem 
{ 
    public MyItems(int copyNumber, string itemName, DateTime time, int guid) 
     :base(copyNumber, itemName, time, guid) 
    { 
    } 

    public DateTime? TimePrinted { get; set; } 
    public string Category { get; set; } 
    public string SubCategory { get; set; } 
    public bool? BestSeller { get; set; } 
} 
0

あなたはMyItems継承AbstractItemを作る、またはそれらの間の変換を処理する方法を作ることができます。

0

キャスト以上のマッパーが必要なようです。 AutoMapperを見たり、habibhassaniの示唆に従って自分のルーチンを書いたりしてください。また、グラントの答えはとても良いです。 あなたの質問はキャストについてのものでしたのでここでキャスト演算子を実装してキャストが機能する方法を示します。これはあなたが軽く手を伸ばすべき技術ではありません。 AbstractItemに直接依存します(MyItems)。これは、コードの保守者にとって最も発見可能なパターンではありません。

public class MyItems 
{ 
    public string ItemName { get; set; } 
    public int CopyNumber { get; set; } 
    public int Guid { get; set; } 
    public DateTime? TimePrinted { get; set; } 
    public string Category { get; set; } 
    public string SubCategory { get; set; } 
    public bool? BestSeller { get; set; } 

    public static explicit operator AbstractItem(MyItems myitems) 
    { 
     return new AbstractItem(myitems.CopyNumber, myitems.ItemName, myitems.TimePrinted, myitems.Guid); 
    } 
} 

さらに2つの遵守事項があります。あなたのクラスAbstractItemの名前をつけることは混乱しています。実際には抽象的ですが、そうではありません。

Guidは、すでにタイプであるためプロパティの名前が貧弱です。Guidという名前のものがintと混乱しています。

関連する問題