2016-04-23 53 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其中負責DataBindings在我的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

你似乎需要一個映射器而不是演員。按照habibhassani的建議查看AutoMapper或編寫自己的例程。此外,格蘭特的答案非常好。 但你的問題是關於鑄造,所以我在這裏展示你如何實現一個鑄造操作符,以便你的鑄造工作。這不是你應該輕易達到的技巧。它直接依賴於AbstractItemMyItems,它不是維護你的代碼的最容易發現的模式。

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

一對夫婦更多的敬意。命名你的課AbstractItem是令人困惑的,這意味着它實際上是抽象的,但它不是。

Guid是一個不好的名稱,因爲它已經是一個類型。你有一個名爲Guid的是int - 令人困惑。